排除匹配内的引号

时间:2014-04-22 22:56:07

标签: php regex

我想从字符串中找到并替换foo='bar' - 一个常见的样式表链接

<link rel='stylesheet' href='http://www.foo.com/bar/baz.min.css' type='text/css' id='23434' foo='bar' media='all'/>

意味着:foo可能位于<link rel='styleshet'之后的任何地方,之后可能会有空格,引号可以是单'或双"

到目前为止我的表达

/<link rel=[',"]stylesheet[',"].*(id=[',"].*[',"])/i

显然它忽略了第一个和最后一个引用之间的引用 - 我尝试了一个负面的看法,但没有成功。

3 个答案:

答案 0 :(得分:5)

使用HTML解析器:

// this is just a snippet for testing and demonstration purposes.
// The OP works with a complete HTML document.
$html = "<link rel='stylesheet' href='foo.com/bar/baz.min.css' type='text/css' id='23434' foo='bar' media='all'/>";

$dom = new DOMDocument();
$dom->loadHTML($html);

$selector = new DOMXPath($dom);

foreach($selector->query('//link[@type="text/css"]') as $link) {
    $link->removeAttribute('id');
    $link->removeAttribute('media');
}

echo $dom->saveHTML();

看到它在这里工作:

答案 1 :(得分:1)

要回答标题中的文字问题,[^"]是“除引号之外的任何字符”。但是hek2mgl对你当前的问题有正确的答案:使用HTML解析器。

答案 2 :(得分:0)

如果

foo='bar'

总是在

之后
id='23434'

你可以使用

/.+id=.+\s(.+)\s/