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

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

谢谢!

4

2 回答 2

2

首先让我说,正则表达式不是正确的工具。(至少没有找到属性;对于替换,可能......)

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

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

正则表达式的一些解释:

我从一个捕获组开始,它确保我们在 -Tag 的href属性内a。我们捕捉到这一点的原因是,它使替换更干净。\s+[^>]*允许其他属性首先出现,但不允许标签关闭。[^"]允许属性中的更多内容首先href出现,但不允许属性关闭。然后我们有bar. 然后我们在关闭属性和标签之前添加更多内容。

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

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

于 2012-10-11T16:08:12.130 回答
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>');
于 2012-10-11T16:03:53.347 回答