你写的正则表达式遍布整个地方.让我们来看看这个模式:
无论发生什么,它都将以< link开头并以>< / link>结束.或/> (必须考虑那些讨厌的不尊重标准的网络海盗).你正在寻找rel参数,如果它有一个,它需要是规范的.
我们可以开始编写正则表达式:#< link([^>])(/> |>< / link>)#is.这将映射所有链接标记.然后,您可以使用简单的strpos调用来解析参数.
如果您确定rel =“canonical”将是链接标记的第一个参数,您可以将正则表达式进一步扩展为#< link rel =“canonical”href =“?'?([^”']) “?'?(/> |>< / link>)#is.这将按顺序映射它,如果您确定这将是订单,这很好.
按出场顺序:
除了>之外,[^>]匹配任何内容角色一次或多次
标志代表:不区分大小写,不要在换行符中断
“?’?匹配0或1”,后跟0或1′
如果还有其他不清楚的地方,请告诉我.
编辑:回答你的问题
> //开始和结束表达式?他们被称为分隔符,他们“包围”表达. Perl正则表达式引擎允许设置关于表达式(i,s,g,b等)的标志,并且这些标志必须在表达式之外.他们追求分隔符 – 这是分隔符的要点.你可以使用你喜欢的任何角色 – 它将选择最远的两个重复角色.人们倾向于使用/由于JS使用单个字符串 – 我倾向于在PHP中使用#来清除因关闭HTML标记而产生的歧义.>()表示必须匹配要返回的字符串的单独“表达式”?()匹配一个子集,如果为匹配项指定变量,则允许您将其返回到结果中.正则表达式的每个部分都可以使用通配符& co,但只包含在()中的东西将在比赛中返回> ^过滤以下列字符串开头的结果?不. []范围之外的^将匹配以下列字符串句点开头的任何内容.在一条新的路线上,有效而不仅仅是“言语”.>结果以以下字符串结尾的$过滤器?与上面相同,只是“结束”而不是“开始”.