2012-11-19 57 views
2

我有一个像下面这样的字符串。如何使用preg-match将html标签替换为其他标签?

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

,我需要这个安排如下

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

我已经尝试了这最后2天,但没有luck.Any帮助?

+2

色素沉着的比赛?基于颜色匹配? – 2012-11-19 09:15:51

+0

对不起兄弟。拼写错误。 – user1835277

+2

你不能用正则表达式解析HTML。 http://stackoverflow.com/a/1732454/477127 – GordonM

回答

0

这真的不是你应该用正则表达式做的事情。如果解决方案对解析的内容做了大量假设,您可能可以将这些解决方案融合在一起,但如果内容偏离预期的任何重要程度,它总是会变得脆弱并易于中断。

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

  1. 找到遵循标签和先于BR文本节点(XPath的可以在这里有用)
  2. 把文本节点为跨度。
  3. 在标签后插入跨度到DOM
  4. 删除BR。
  5. 包装标签和跨度在李
+0

我已经修复了它。 – GordonM

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> 
*/