【问题标题】:I want to replace "or" with "|" which are not in double quote using PHP我想用“|”替换“或”没有使用 PHP 的双引号
【发布时间】:2018-01-22 15:13:45
【问题描述】:

输入:

"Supermajority Vote for State Taxes or fees" or taxes or "ssd or ffF"

预期输出:

"Supermajority Vote for State Taxes or fees" | taxes | "ssd or ffF"

我尝试过,但我无法处理多次出现:

preg_replace("/(\".*\")\s+(or)\s+(.*)/", "$1 | $3", $input);

【问题讨论】:

标签: php regex preg-replace


【解决方案1】:

检查直到字符串结尾的引号数量是偶数

\bor\b(?=([^\"]|\"[^\"]+\")+$)

demo and some explanations

\b - 字边界

(?= - expretion 之后出现的正向前瞻测试

([^\"]|\"[^\"]+\") - 没有引号或"some things in quotes"

【讨论】:

  • 更好地使用(*SKIP)(*FAIL),真的。
【解决方案2】:

您在问题中给出的正则表达式可能有一个修复程序。但是,如果您需要在输入中引用引号怎么办?

"Supermajority Vote for \"State Taxes\" or \"fees\"" or taxes or "ssd or ffF"

好的,现在您要查找引号之间的字符串,除非引号前面有反斜杠。但是如果你想在字符串的末尾加上一个反斜杠呢?

"Supermajority Vote for State Taxes or fees\\" or taxes or "ssd or ffF"

所以现在你想找到引号之间的字符串,除非它前面有一个反斜杠,除非那个反斜杠前面有另一个反斜杠。

您可以像这样继续,但是不可能编写一个正则表达式来支持无限数量的反斜杠。要正确执行此操作,您需要build a lexer

【讨论】:

  • 这更像是一个理论上的“思考这个”而不是一个实际的答案。你没有错,但你也没有真正编写解决方案。如果您想推荐工具/场外资源,那很好,请将您的建议作为评论发布在问题下方。
【解决方案3】:

(*SKIP)(*FAIL) 的完美示例:

"[^"]+"(*SKIP)(*FAIL)|\bor\b

这需要替换为|,参见a demo on regex101.com


PHP:
<?php

$string = '"Supermajority Vote for State Taxes or fees" or taxes or "ssd or ffF"';
$regex = '~"[^"]+"(*SKIP)(*FAIL)|\bor\b~';

$string = preg_replace($regex, '|', $string);

echo $string;
?>

产量

"Supermajority Vote for State Taxes or fees" | taxes | "ssd or ffF"


分解,表达的意思是:
"[^"]+"        # everything between "..."
(*SKIP)(*FAIL) # "forget" everything to the left
|              # or
\bor\b         # or with boundaries on both sides (meaning neither for nor nor, etc.)


正如@mickmackusa 指出的那样,您甚至可以使用转义的反斜杠,请参阅a demo on regex101.com

【讨论】:

  • @NikhilBhivgade 老实说。 (*假设您有平衡的引用并且没有要处理的转义引用)您不能比 Jan 发布的更好地完成此任务。它是最快、最干净、最直接的。所以适度不喜欢我要求你移动绿色勾号,但它确实吸引了新访问者/读者/研究人员的注意力。所以无论你是否移动绿色勾号,你都应该在你的项目中实现这个方法,因为它是最好的。我并不讨厌飞溅,这些只是事实。来自我的 +1。
  • 附注您可以像这样处理转义的双引号:~"(?:[^"]+|\\")*"(*SKIP)(*FAIL)|\bor\b~
  • @mickmackusa:太棒了,谢谢。想知道反斜杠的事情(这里的其他答案+1 ;-))。
猜你喜欢
  • 2021-08-04
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 2015-07-22
  • 2013-04-15
  • 1970-01-01
相关资源
最近更新 更多