也许它不能像我想的那样解决这个问题,但也许你可以帮助我们。
我的产品名称中有很多格式错误的字样。
其中一些标题为(
,尾随)
或其中之一,/
和"
标记相同。
我所做的是我用空格分解产品的名称,并检查这些词。
所以我想把它们换成零。但是,硬盘可能是40GB ATA 3.5" hard drive
。我需要处理所有单词,但我不能使用与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_replace()
答案 0 :(得分:1)
您可以使用另一种方法:而不是定义一个模式数组,使用一个基于交替的正则表达式:
preg_replace('~^[(/]|[/)]$|^"(.*)"$~s', '$1', $s)
请参阅regex demo
<强>详情:
^[(/]
- 字符串开头的文字(
或/
|
- 或[/)]$
- 字符串末尾的文字)
或/
|
- 或^"(.*)"$
- 字符串开头的"
,然后是任意0个字符(由于/s
选项,.
也匹配换行符序列)被捕获到组1中,而"
被捕获到字符串的末尾。 替换模式为$1
,当匹配前两个备选项时为空,如果匹配第三个备选项,则包含第1组值。
注意:如果您需要替换,直到找不到匹配项,请同时使用preg_match
与preg_replace
一起使用(请参阅demo):
$s = '"/some text/"';
$re = '~^[(/]|[/)]$|^"(.*)"$~s';
$tmp = '';
while (preg_match($re, $s) && $tmp != $s) {
$tmp = $s;
$s = preg_replace($re, '$1', $s);
}
echo $s;
答案 1 :(得分:0)
这有效
preg_replace([[/(]?(.+)[/)]?|/\"(.+)\"/], '$1', $string)