【问题标题】:replace semicolon (;) but not html characters (  etc.)替换分号 (;) 但不替换 html 字符 (  等)
【发布时间】:2013-08-26 11:54:41
【问题描述】:

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

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

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

我该怎么做?

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

【问题讨论】:

  • 请注意,regex 标签还声明:还请包含一个标签,指定您正在使用的编程语言或工具。

标签: php javascript regex html-parsing smarty


【解决方案1】:

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

  1. 删除所有字符,\w : ; &amp; 除外
  2. 将所有&amp;copy; 替换为@@@copy###
  3. 您现在可以将: ; 替换为&lt;td&gt;
  4. 将所有@@@copy### 替换为&amp;copy;
  5. 删除所有&amp;nbsp;

【讨论】:

  • 实际上我在 smarty 中的正则表达式看起来像这样 " |regex_replace:"/[:]\s*/":""|regex_replace:"/[;]\s */":" " " 所以唯一的事情就是删除 html 字符...
  • 第2步,可以将/&amp;(\w){1,4});/全部替换为@@@$1###(javascript语法)
  • 但是有很多特殊字符...例如我见过 ø 的用法我相信这应该是一种跳过正则表达式的方法,例如这里stackoverflow.com/questions/3194867/…
  • 负前瞻有点复杂,并且在某些语言中没有得到很好的支持。所以我认为最简单的方法是用一些个人标签替换 html 字符。然后将它们替换回去;
  • 你能帮我写这个东西吗?得到单词“«” ==> /&(\w){1,8});/ ==> @@@laquo### 如你所愿?
【解决方案2】:

怎么样:

$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);

【讨论】:

  • 顺便说一句,聪明的解决方案非常简单,而不是使用花括号!
【解决方案3】:

使用否定的look-behind查找分号不是编码字符的一部分:

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

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

查看此正则表达式的live demo

【讨论】:

  • 你能写一个完整的版本吗?
  • 我相信它正在工作)但是我在使用 smarty 解析器时遇到了一些麻烦问题......但这并不是不允许你回答,谢谢!
  • 这对我有用,虽然我把 [a-z] 换成了 #[0-9],那么你只需要做 2,3 和 4 个长度
猜你喜欢
相关资源
最近更新 更多
热门标签