在html属性中的preg_replace单词

时间:2012-10-11 15:58:22

标签: php regex preg-replace

<a href="http://www.example.com/foo/bar/" title="bar">Example</a>

如何仅在href属性中替换“bar”?

谢谢!

2 个答案:

答案 0 :(得分:2)

首先我要说regular expressions are not the right tool。 (至少不要找到属性;对于替换,可能......)

但是,无论如何,这是一个正则表达式解决方案,但我无法保证它将适用于所有有效的DOM。

$newStr = preg_replace(
    '/(<a\s+[^>]*href="[^"]*)bar([^"]*"[^>]*>)/',
    '$1newString$2',
    $str);

正则表达式的一些解释:

我从一个捕获组开始,确保我们位于href - Tag的a属性中。我们捕获这个的原因是,它使更换更清洁。 \s+[^>]*允许首先使用其他属性,但不允许标记关闭。 [^"]允许href属性中的更多内容首先出现,而不是要关闭的属性。然后我们有bar。然后我们在关闭属性然后关闭标记之前添加更多内容。

替换然后只使用捕获的群组$1$2(其中包含bar周围的所有内容,我们必须使用它来确保它位于正确的位置)但插入新的中间的字符串(以前是bar)。

注意,如果您在> - 属性之前包含href的属性,这将特别中断!

答案 1 :(得分:0)

这样的东西可行,但您想要采取的确切方法实际上取决于您是否要对不区分大小写,对特定链接或页面中的所有链接(即全局)和目标执行此操作你的替换。

$var = preg_replace('@<a href=(["\'])(.*)/bar/["\']@', "<a href=\\1\\2/foo/\\1", '<a href="http://www.example.com/foo/bar/" title="bar">Example</a>');