我有大量文本被加载到标题中,其中包含此链接。
<link rel="canonical" href="could_be_anything_here_at_all" />
我想用一个新值替换它,但是 href 会根据页面发生变化,这意味着简单的 str_replace 是不可能的。
我看过使用 preg_replace,但无法理解这个看似简单的问题。
$regex = '/(^<link rel="canonical")(\/>$)/';
$match = preg_match_all($regex, $content, $matches);
var_dump($matches);
- //开始和结束表达式?
- () 表示必须匹配才能返回字符串的单独“表达式”?
- 以下列字符串开头的结果的 ^ 过滤器?
- 以下列字符串结尾的结果的 $ 过滤器?
所以我正在寻找以 <link rel="canonical"
开头的字符串并以 />
结尾
我已经展示了我要执行的步骤,以及我的尝试。请帮我写,最终明白怎么做。我对此真的很茫然。
最佳答案
您编写的正则表达式无处不在。让我们回顾一下模式:
无论发生什么,它都会以 <link
开头并以 ></link>
结尾或 />
(必须考虑到那些讨厌的不遵守标准的网络海盗)。您正在寻找 rel 参数(如果有的话),并且它必须是规范的。
我们可以开始写正则表达式了:#<link([^>]+)(/>|></link>)#is
.这将映射所有 link
标签。然后您可以使用简单的 strpos
解析参数电话。
如果您确定 rel="canonical"将是链接标签的第一个参数,您可以将正则表达式进一步扩展为 #<link rel="canonical" href="?'?([^"']+)"?'?(/>|></link>)#is
.这将按顺序映射它,如果您确定这将是顺序,这很好。
按出现顺序:
[^>]+
匹配除 >
以外的任何内容字符一次或多次
is
标志代表:不区分大小写,不要在换行符处中断
"?'?
匹配 0 或一个 ",后跟 0 或 1 '
如果还有什么不清楚的,请告诉我。
编辑:回答你的问题
//开始和结束表达式? 它们被称为定界符,它们“包围”了表达式。 Perl 正则表达式引擎允许设置有关表达式的标志(i、s、g、b 等),并且这些标志必须在表达式之外。他们在定界符之后 - 这就是定界符的要点。您可以使用您喜欢的任何字符 - 它会选择最远的两个重复字符。由于 JS 为他们使用单个字符,人们倾向于使用/- 我倾向于在 PHP 中使用 # 来清除关闭 HTML 标记引起的歧义。
() 表示必须匹配才能返回字符串的单独“表达式”? () 匹配一个子集,如果您为匹配项指定一个变量,则允许您在结果中取回它。正则表达式的每一部分都可以使用通配符 & co,但是只有包含在 () 中的内容才会在匹配中返回
- 以下列字符串开头的结果的 ^ 过滤器? 没有。 [] 范围外的 ^ 将匹配任何以开始 并带有以下字符串句号的内容。在新的一行中,有效地,不仅仅是“单词”。
- 以下列字符串结尾的结果的 $ 过滤器? 同上,只是“结束”而不是“开始”。
关于php - 正则表达式/通配符替换字符串 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16350057/