Php 数组中的正则表达式规则
也许这不能解决这个问题,因为我想,但也许你们可以帮助我,伙计们 我的产品名称中有很多格式错误的单词 其中一些符号有前导的Php 数组中的正则表达式规则,php,regex,Php,Regex,也许这不能解决这个问题,因为我想,但也许你们可以帮助我,伙计们 我的产品名称中有很多格式错误的单词 其中一些符号有前导的(和尾随的)或者其中的一个,对于/和“符号是相同的 我要做的是用空格分解产品名称,然后检查这些单词 所以我想把它们换成零。但是,一个硬盘驱动器可以是40GB ATA 3.5英寸硬盘驱动器。我需要处理所有单词,但我不能对3.5“使用与()或/相同的方法,因为这3.5”是有效的 所以我只需要替换引号,当它位于字符串的开头和结尾时 $cases = [ '(testone)'
(
和尾随的)
或者其中的一个,对于/
和“
符号是相同的
我要做的是用空格分解产品名称,然后检查这些单词
所以我想把它们换成零。但是,一个硬盘驱动器可以是40GB ATA 3.5英寸硬盘驱动器
。我需要处理所有单词,但我不能对3.5“
使用与()
或/
相同的方法,因为这3.5”
是有效的
所以我只需要替换引号,当它位于字符串的开头和结尾时
$cases = [
'(testone)',
'(testtwo',
'testthree)',
'/otherone/',
'/othertwo',
'otherthree/',
'"anotherone',
'anothertwo"',
'"anotherthree"',
];
$patterns = [
'/^\(/',
'/\)$/',
'~^/~',
'~/$~',
//Here is what I can not imagine, how to add the rule for `"`
];
$result = preg_replace($patterns, '', $cases);
这很好,但是可以在一个regex\u replace()
中完成吗?如果是,有人可以帮我找出报价的模式吗
报价的结果应如下所示:
'"anotherone', //no quote at end leave the leading
'anothertwo"', //no quote at start leave the trailin
'anotherthree', //there are quotes on start and end so remove them.
这很有效
preg_replace([[/(]?(.+)[/)]?|/\"(.+)\"/], '$1', $string)
您可以使用另一种方法:而不是定义一组模式,而是使用一个基于交替的正则表达式:
preg_replace('~^[(/]|[/)]$|^"(.*)"$~s', '$1', $s)
见
详细信息:
-字符串开头的文本^[(/]
或(
)/
-或|
-字符串末尾的文本[/)]$
或)
/
-或|
-a^”(.*)$
在字符串开头,然后是捕获到组1中的任何0+字符(由于“
选项,/s
也匹配换行符序列),并在字符串结尾添加
李>”
$1
,当前两个备选方案匹配时为空,如果第三个备选方案匹配,则包含组1值
注意:如果需要更换,直到找不到匹配项为止,请将preg\u match
与preg\u replace
一起使用(请参阅):
是的,但它不能与我的
$pattersn
数组混合,因为在另一种情况下,我将结果替换为零,而您可以使用此站点对'$1'
进行测试,结果非常不好,/
最后保留,)
最后保留,“另三个”
未被触及。这是否意味着如果字符串以“
”-“/^”(?=.*”$)/s“
结尾,则需要2个regexp-1)作为首字母”
”(对于当前方法没有办法)?@WiktorStribiż如果第一个字符是,则只能替换新引号“
最后一个字符是“
quote太多了,应该只替换这两个引号。效果很好。。。非常感谢。我很高兴取消删除帖子并接受你的答案。我没有删除它,因为我没有得到答案,正如你看到我的声誉,我有点熟悉。我删除了它,因为当你问我的问题时,我想,我的问题不够清楚,当我回答你的问题时,我确实觉得,这不会让你更接近理解。无论如何,我有一个问题是关于你的解决方案,请稍等。对不起,当然。如果你检查一下我的历史,你会发现我不太擅长提问:(只是不理解原因。当然,我会很高兴澄清任何疑问。好的,在我再次阅读你的答案后,我没有问题。你对这件$1
的事情多么狡猾。我从来没有想过它会被“黑客”攻击就像这样,如果你不定义一个组,那么$1将是空的。太棒了,今天我学到了一些新东西。事实上,这是一个很好的观点:$1
是一个反向引用,在每个正则表达式匹配处预填充一个空字符串。它与\
符号的模式内联反向引用的工作原理不同(匹配空字符串的组与不匹配的可选组之间存在差异)。因此,是的,在此处使用$1
是安全的。
$s = '"/some text/"';
$re = '~^[(/]|[/)]$|^"(.*)"$~s';
$tmp = '';
while (preg_match($re, $s) && $tmp != $s) {
$tmp = $s;
$s = preg_replace($re, '$1', $s);
}
echo $s;