我正在使用以下代码在<span>
代码后添加<a>
代码。
$html = preg_replace("~<a.*?href=\"$url\".*?>.*?</a>~i", "$0<span>test</span>", $html);
代码适用于常规链接(即。http://www.google.com/),但当$ url的内容为$link$/3/
时,它不会执行替换。
这是显示(错误)行为的示例代码:
<?php
$urls = array();
$urls[] = '$link$/3/';
$urls[] = 'http://www.google.com/';
$html = '<a href="$link/3/">Test Link</a>' . "\n" . '<a href="http://www.google.com/">Google</a>';
foreach($urls as $url) {
$html = preg_replace("~<a.*?href=\"$url\".*?>.*?</a>~i", "$0<span>test</span>", $html);
}
echo $html;
?>
这是它产生的输出:
<a href="$link$/3/">Test Link</a>
<a href="http://www.google.com/">Google</a><span>test</span>
答案 0 :(得分:3)
$url = preg_quote($url, '~');
美元符号被解释为通常的:输入结束。
答案 1 :(得分:2)
只是某人是正确的;如果你的意思是将它们解释为文字,你必须转义你的特殊正则表达式字符。
它也让我觉得它无法执行替换,因为它永远不会匹配。
尝试替换此行:
$urls[] = '$link$/3/';
有了这个:
$urls[] = '$link/3/';
答案 2 :(得分:1)
$
被视为特殊的正则表达式字符,需要进行转义。在将$url
传递给preg_replace()
之前,请使用preg_quote()
来转义$url = preg_quote($url, '~');
。
{{1}}
答案 3 :(得分:0)
$在正则表达式中有特殊含义。行结束。你的表达式正在扩展如下:
$html = preg_replace("~<a.*?href=\"$link$/3/\".*?>.*?</a>~i", "$0<span>test</span>", $html);
哪个失败,因为它找不到两行之间的“链接”。尝试转义$ urls数组中的$:
$urls[] = '\$link\$/3/';