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

Php 替换分号(;),但不替换html字符(等),php,javascript,regex,html-parsing,smarty,Php,Javascript,Regex,Html Parsing,Smarty,我正在为我的问题寻找regexp。 我有一个文本(产品规格),例如: 长度:20cm;高度:10厘米&拉阔;夜»;方式:是;制造商:索尼复制;手册:是 最终结果应该是这样的 <tr><td>length</td><td>20cm</td></tr> ... <tr><td>manufacturer</td><td>Sony&copy;</td>&l

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

长度:20cm;高度:10厘米&拉阔;夜»;方式:是;制造商:索尼复制;手册:是

最终结果应该是这样的

<tr><td>length</td><td>20cm</td></tr>
...
<tr><td>manufacturer</td><td>Sony&copy;</td></tr>
长度20cm
...
制造商名称和副本;
因此,我应该替换
:“
的+空格字符(\s*)
”;“
的+空格字符(\s*)
,但在
前面有拉丁符号
[a-z]+
&
符号的情况下不应该这样做。 重点是html字符,如&&_拉阔&_包含“;”的副本等

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

我该怎么做

我在smarty中的regexp如下所示: “|regex_replace:”/[:]\s*/”:“| regex_replace:”/[;]\s*/“:”,所以唯一的事情就是删除html字符。。。我尝试了一些与(?!)的组合,但没有成功 我在找这样的东西

如果必须使用正则表达式,可以执行以下步骤:

  • 删除所有字符,除了
    \w:&
  • 替换所有
    &复制
    @@@copy###
  • 您可以替换
    进行编码>
  • 将所有
    @@@copy
    替换为
    ©
  • 删除所有
  • 那么:

    $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);
    
    $str='长度:20厘米;高度:10厘米&拉阔;夜»;方式:是;制造商:索尼复制;手册:是';
    $str=preg#u replace(“#(?!&[a-z]+);#,”,“$str);
    $str=preg#u replace(“#:”,“$str”);
    
    使用反向查找查找不属于编码字符的分号:

    (?<!&[a-z]{2})(?<!&[a-z]{3})(?<!&[a-z]{4})(?<!&[a-z]{5});\s*
    
    (?
    此正则表达式只匹配裸分号。不幸的是,需要多个look behinds,因此涵盖了所有可能的情况,因为负look behinds需要固定长度的表达式


    请参阅此正则表达式的a。

    注意,
    regex
    标记还声明:请同时包含一个指定您正在使用的编程语言或工具的标记。实际上,我在smarty中的regexp类似于“|regex\u replace://[:]\s*/”:”;regex\u replace://[;]\s*/”:“””因此,唯一的事情是删除html字符…步骤2,您可以替换所有的
    /&(\w){1,4})/
    @@@1####
    (javascript语法)但是有太多特殊字符。。。例如,我看到了ø;我认为这应该是一种跳过regexp的方法,例如,这里的负前瞻有点复杂,在某些语言中不受很好的支持。所以我认为最简单的方法是用一些个人标记替换html字符。然后把它们换回来;你能帮我写这东西吗?获取单词“«;”==>/&(\w){1,8});/=>@@@laquo######正如你所建议的那样?顺便说一句,smarty的解决方案非常简单,而不是使用花括号!你能写一个完整的版本吗?我相信它能工作)但是我在使用smarty解析器时遇到了一些问题。。。但这并不是拒绝你的回答,谢谢!这对我来说很有效,虽然我将
    [a-z]
    替换为
    #[0-9]
    ,但您只需要执行2、3和4个长度