替换分号(;)但不是html字符(等)

时间:2013-08-23 12:19:16

标签: php javascript regex html-parsing smarty

我正在为我的问题寻找正则表达式。 我有一个文本(产品规格),例如:

length: 20cm; height: 10cm; «Night» mode: yes; manufacturer : Sony© manual : yes

最终结果应如下所示

<tr><td>length</td><td>20cm</td></tr>
...
<tr><td>manufacturer</td><td>Sony&copy;</td></tr>

所以我应该为":" + whitespace characters(\s*)替换"</td><td>",为";" + whitespace characters(\s*)替换"</td></tr><tr><td>",但在有拉丁符号[a-z]+和{{1}的情况下不能在&之前签名。 重点是html字符,如&amp; _nbsp; &安培; _laquo; &amp; _copy等包含“;”

换句话说;但不是:\s*

我该怎么做?

我在smarty中的正则表达如下: “| regex_replace:”/ [:] \ s * /“:”“| regex_replace:”/ [;] \ s * /“:”“”所以唯一的办法是删除html字符...我尝试了一些组合(?!...)但没有成功 我正在寻找这样的东西 RegExp for matching three letters, but not text "BUY"

3 个答案:

答案 0 :(得分:2)

使用负面后卫查找分号而不是编码字符的一部分:

(?<!&[a-z]{2})(?<!&[a-z]{3})(?<!&[a-z]{4})(?<!&[a-z]{5});\s*

这个正则表达式只匹配裸露的半冒号。不幸的是,需要多个后视镜,以涵盖所有可能性,因为需要固定长度表达的负面外观。

查看此正则表达式的live demo

答案 1 :(得分:0)

如果您必须使用正则表达式,则可以这样执行:

  1. 删除除\w : ; &
  2. 以外的所有字符
  3. 将所有&copy;替换为@@@copy###
  4. 您可以将: ;替换为<td> now
  5. 将所有@@@copy###替换为&copy;
  6. 删除所有&nbsp;

答案 2 :(得分:0)

怎么样:

$str = 'length: 20cm; height: 10cm; &laquo;Night&raquo; mode: yes;&nbsp;manufacturer : Sony&copy; manual&nbsp;:&nbsp;yes';
$str = preg_replace('#(?!&[a-z]+); #', '</td></tr><tr><td>', $str);
$str = preg_replace('#: #', '</td><td>', $str);