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;