【问题标题】:Regex attribute out of tag正则表达式属性超出标签
【发布时间】:2013-11-29 01:27:50
【问题描述】:

我正在尝试仅对 src 属性(没有其内容/值)进行正则表达式并将其替换为其他内容。

它还必须验证 HTML 标记(示例中为 img)。

测试数据示例:

<img src="http://example.com" class="something" />

现在我只需要获取“src”并替换它。是否可以在 PHP 中将其作为第一个/唯一匹配的lookbehind/lookahead?

【问题讨论】:

  • 不要在 html 上使用正则表达式。使用DOM

标签: php regex regex-lookarounds


【解决方案1】:

你的意思是这样的?

preg_replace('/(<img[^>]*src=")[^"]*"/', '$1'.$new.'"', $html)

向后看是不可能的,因为它不能是可变长度的。

【讨论】:

  • 确实,你不能使用lookbehind(可变长度的原因),但你可以使用\K功能从匹配结果中删除它之前的所有匹配,例如:&lt;img\b[^&gt;]*src="\K[^"]*(?=")那么你的替换字符串只有:$new
【解决方案2】:

不应使用正则表达式来解析 html。
相反,修改 DOM 以执行您需要的操作。

$doc = new DOMDocument();
$doc->loadHTML('<img src="http://example.com" class="something" />');
$images = $doc->getElementsByTagName('img');
foreach ($images as $image) {
    $image->setAttribute('src','http://www.google.com');
    echo htmlentities($doc->saveHTML($image));
}

【讨论】:

    猜你喜欢
    • 2010-09-23
    • 2011-04-18
    • 2011-02-01
    • 1970-01-01
    • 2011-04-12
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    相关资源
    最近更新 更多