Php 替换分号(;),但不替换html字符(等)
我正在为我的问题寻找regexp。 我有一个文本(产品规格),例如: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©</td>&l
长度:20cm;高度:10厘米&拉阔;夜»;方式:是;制造商:索尼复制;手册:是
最终结果应该是这样的
<tr><td>length</td><td>20cm</td></tr>
...
<tr><td>manufacturer</td><td>Sony©</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; «Night» mode: yes; manufacturer : Sony© manual : 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个长度