如何使用preg-match将html标签替换为其他标签?

时间:2012-11-19 09:12:57

标签: php regex preg-match

我有一个如下字符串。

<label>value1<label>:value<br>
<label>value2<label>:value<br>
<label>value3<label>:value<br>

我需要安排如下

 <li><label>value1<label><span>value</span><li>

我过去2天试过了,但没有运气。有什么帮助吗?

2 个答案:

答案 0 :(得分:0)

这真的不是你应该用正则表达式做的事情。您可能能够将一个有效的解决方案融合在一起,前提是它对其解析的内容做了大量假设,但如果内容偏离预期的任何重要程度,它将始终是脆弱的并且容易破解。

更好的选择是使用PHP的DOM family类。我并不是真的可以自由地为你编写代码(而且这不是什么原因),但我可以给你一个关于你需要遵循的步骤的指针。

  1. 找到标签后面的文本节点并在BR之前(XPath在这里可能很有用)
  2. 将文本节点放入范围。
  3. 在标签
  4. 之后将范围插入DOM
  5. 删除BR。
  6. 在li
  7. 中包装标签和跨度

答案 1 :(得分:0)

如果为了正则表达式,您应该使用它,请按照以下步骤操作:

$string = <<<TOK
<label>value1<label>:value<br>
<label>value2<label>:value<br>
<label>value3<label>:value<br>
TOK;
preg_match_all('/<label>(.*?)<label>\:(.*?)<br>/s', $string, $matches);
print_r($matches);
/*
Array
(
    [0] => Array
        (
            [0] => value1:value
            [1] => value2:value
            [2] => value3:value
        )
    [1] => Array
        (
            [0] => value1
            [1] => value2
            [2] => value3
        )

    [2] => Array
        (
            [0] => value
            [1] => value
            [2] => value
        )
)
*/
$content = "";
foreach($matches as $key => $match)
{
    $content.= "<li><label>{$matches[1][$key]}<label><span>{$matches[2][$key]}</span><li>\n";
}
echo($content);
/*
Output:
    <li><label>value1<label><span>value</span><li>
    <li><label>value2<label><span>value</span><li>
    <li><label>value3<label><span>value</span><li>
*/