[英]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.