preg_replace用于DIV标记中的自有属性

时间:2011-06-15 14:21:35

标签: php html preg-replace replace

我有一个关于preg_replace问题的快速问题。我只是RegEx的新手。 我想要实现的目标如下:

  • 我有一个DIV标记<div data-info="sourcefile.ext" class="elm swf">sourcefile</div>
  • 我想提取(data-info)值和(class)值
  • 可能有可选标签,但我不需要这些属性的值
  • 此替换应在一个字符串中多次使用

我有:

$input = '<div data-info="sourcefile.ext" class="elm swf">sourcefile</div>';
$input = preg_replace('/(<div\s(class="(.*?)")\s(data-info="(.*?)")\b[^>]*>)(.*?)<\/div>/i', "$1 class:$2 data-info:$3", $input);

我想将值用作:<object src="(data-info)" type="(class)">

这可能吗?有人可以向我展示/解释这是如何运作的吗?

非常感谢。

1 个答案:

答案 0 :(得分:0)

您的正则表达式失败,因为它以错误的顺序列出属性。匹配模式不适合这样的事情(这是为了这样的目的而更喜欢使用DOM解析器的实际原因。)

\b转义是错误的。您可以将这两个属性包装到(?: .. | .. )+中,以避免出现歧义:

 $input = preg_replace('/(?:<div
     (?: \s class="(.*?)"
       | \s data-info="(.*?)"  )+
     [^>]*>)
     (.*?)<\/div>/ix', "$3 class:$1 data-info:$2", $input);

$ 1 $ 2 $ 3编号已关闭,也许你想在这里使用named capture groups