繁体   English   中英

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

[英]Regex/wildcard replace on a string PHP

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

<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或1”,后跟0或1'

如果还有其他不清楚的地方,请告诉我。

编辑:回答你的问题

  • //开始和结束表达式? 他们被称为分隔符,他们“包围”表达。 Perl正则表达式引擎允许设置关于表达式(i,s,g,b等)的标志,并且这些标志必须在表达式之外。 他们追求分隔符 - 这是分隔符的要点。 你可以使用你喜欢的任何角色 - 它将选择最远的两个重复角色。 人们倾向于使用/由于JS使用单个字符串 - 我倾向于在PHP中使用#来清除因关闭HTML标记而产生的歧义。

  • ()表示单独的'表达式',它们必须匹配要返回的字符串? ()匹配一个子集,如果为匹配项指定变量,则允许您将其返回到结果中。 正则表达式的每个部分都可以使用通配符和co,但只有在()中包含的东西才会在匹配中返回

  • ^过滤以下列字符串开头的结果? 不。 []范围之外的^将匹配以下列字符串句点开头的任何内容。 在一条新的路线上,有效而不仅仅是“言语”。
  • 结果的$过滤器以下面的字符串结尾? 与上面相同,只是“结束”而不是“开始”。

快速入门注意:不建议使用正则表达式解析HTML,而是使用DomDocument或其他一些“DOM解析”附加组件。 但由于这只是使用1个句子的字符串,这就是我接近它的方式:

<?php
// base string
$str = '<link rel="canonical" href="could_be_anything_here_at_all" />';

// for preg_replace
$preg_replace = '<link rel="canonical" href="'.preg_replace('/<link rel="canonical" href="(.*)" \/>/','MY_NEW_LINK',$str).'" />';
echo $preg_replace;

// preg_match_all
preg_match_all('/<link rel="canonical" href="(.*)" \/>/',$str,$preg_match);
echo '<pre>',print_r($preg_match),'</pre>'; // process as you wish

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM