php - 正则表达式/通配符替换字符串 PHP

标签 php regex

我有大量文本被加载到标题中,其中包含此链接。

<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/

相关文章:

mysql - 如何替换正则表达式中的分隔词

regex - 使用可变左/右分隔符匹配字符串

javascript - 找到一种方法来查找与正则表达式不匹配的字符是 javascript

php - 如何在 Laravel 中使用紧凑型发送成功消息

php - 如何提高频繁插入率的MySQL查询性能?

php - 使用php连接mongodb

php - 带默认值的 Laravel 模型方法

javascript - 如何通过 Javascript 将数据作为数组发送到 PHP?

javascript - 正则表达式捕获斜杠之间的字符串

javascript - 风格不适用于 ul li 倒计时