0

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

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*)for"</td><td>"";" + whitespace characters(\s*)for ,但不是在 .之前"</td></tr><tr><td>"有拉丁符号[a-z]+和符号的情况下。关键在于像 &_nbsp; 这样的 html 字符。&_laquo; &_copy 等包含“;”&;

换句话说:\s*,但不是&[a-z]+[;]

我怎样才能做到这一点?

我在 smarty 中的正则表达式如下所示: " |regex_replace:"/[:]\s*/":""|regex_replace:"/[;]\s*/":"" " 所以唯一的事情就是删除 html字符...我尝试了一些与 (?!...) 的组合,但没有成功我正在寻找类似 RegExp 的东西来匹配三个字母,而不是文本“BUY”

4

3 回答 3

2

使用否定的look-behind查找属于编码字符的分号:

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

此正则表达式仅匹配裸分号。不幸的是,由于需要固定长度的表达式,需要多次后视,因此涵盖了所有可能性。

查看此正则表达式的现场演示

于 2013-08-23T13:52:12.720 回答
0

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

  1. 删除所有字符,除了\w : ; &
  2. 全部替换&copy;@@@copy###
  3. 你可以: ;<td>现在替换
  4. 全部替换@@@copy###&copy;
  5. 移除所有&nbsp;
于 2013-08-23T13:05:34.267 回答
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);
于 2013-08-23T13:50:22.727 回答