在两个特定字符之间删除逗号

6
我目前有以下字符串:

我目前有以下字符串:

"Blah, blah, blah,~Part One, Part Two~,blah blah"

我需要删除~字符之间的逗号,使其读作。
"Blah, blah, blah,~Part One Part Two~,blah blah"

可以有人帮我吗?
非常感谢。
3个回答

6
如果在所有的波浪符之间只有一个逗号,并且所有波浪符中有偶数个,则:
preg_replace("/~([^,]*),([^,]*)~/", "~\1\2~", $text) 

应该这样做。


1

这可能更容易分几步来完成:

  • ~上进行拆分
  • 仅转换“内部”的部分~
    • 只需用''替换','
  • 使用~将部分重新连接在一起

一个正则表达式解决方案

话虽如此,假设有偶数个~,在正则表达式中也是可能实现的:

<?php

echo preg_replace(
   '/(^[^~]*~)|([^~]*$)|([^,~]*),|([^,~]*~[^~]*~)/',
   '$1$2$3$4',
   'a,b,c,~d,e,f~,g,h,i,~j,k,l,~m,n,o~,q,r,~s,t,u'
);

?>

以上代码输出结果为 (在codepad.org上看到):
a,b,c,~def~,g,h,i,~jkl~m,n,o~qr~s,t,u

工作原理

有4种情况:

  • 我们在字符串的开头,"外部"
    • 只需匹配直到找到第一个~,下次我们就会进入"内部"
    • 所以,(^[^~]*~)
  • 没有更多的~直到字符串的末尾
    • 如果有偶数个~,我们将处于"外部"
    • 只需匹配直到结尾
    • 所以,([^~]*$)
  • 如果不是以上任何一种情况,我们就处于"内部"
    • 继续查找下一个逗号之前的~(所以我们仍然处于"内部")
      • 所以,([^,~]*),
    • 如果我们找到的是~而不是逗号,则退出,然后在下一个~上重新进入
      • 所以,([^,~]*~[^~]*~)
在所有情况下,我们都确保捕获足够的内容以重构字符串。
参考资料

0
$string = "Blah, blah, blah,~Part One, Part Two~,blah blah";
$pos1 = strpos($string, "~");

$substring = substr($string, $strpos, strlen($string));
$pos2 = strpos($string, "~");

$final = substr($substring, $pos1, $pos2);
$replaced = str_replace(",", "", $final);

$newString = str_replace($final, $replaced, $string);
echo $newString;

它能完成任务,但我是在这里编写的,可能会有问题(至少是性能问题)。


1
我很高兴有正则表达式。 - Johannes Gorset
1
没错!:) 我觉得正则表达式可能对他想要的东西太具体了(例如:在示例上有效,但在实际情况下无效):) - Bogdan Constantinescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接