【问题标题】:Find string inside single and double quotation marks using regex使用正则表达式在单引号和双引号内查找字符串
【发布时间】:2015-05-15 13:29:47
【问题描述】:

如何使用正则表达式在"" 和'' 之间查找字符串。只是我想使用 PHP preg_match_all() 函数创建一个函数,该函数将匹配文件中的所有静态字符串,所以可能我们正在使用 "" 和 '' 创建一个字符串,所以我需要从文件中找到所有这些字符串.

【问题讨论】:

  • 到目前为止你尝试过什么?正则表达式可能不是合适的解决方案,因为您必须处理字符串中的(转义)引号...例如 'From time to "time"' 或 "From time to \"time\""
  • 我不同意否决票,因为这是一个真正的问题。即使正则表达式不是正确的解决方案。尽管模棱两可,但基于 OPS 问题,简单的答案是:/(["']+?)(.*?)(\1?)/ - 但是@ericbn 关于嵌套有一个有效的观点;虽然这可以通过正则表达式中的否定/前瞻来解决。
  • 是否要搜索 PHP 文件中的所有静态字符串?还是您正在以另一种特定格式进行搜索?
  • @Ash 如果您认为这是一个好问题,请附上您的答案。
  • @BenoitEsnard 显然是 OP,这不是一个格式错误的问题,或者与网站无关,因此不值得一票否决。我可能会提出我的答案,但这并不意味着我现在可以发布一个快速的oneliner。

标签: php regex preg-match-all


【解决方案1】:

您应该知道,在那些引用的“实体”中,您可能会发现转义引号。匹配这些字符串的最佳方法是使用这样的正则表达式:

(?s)'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"

见demo

示例代码:

$re = "/(?s)'(?:[^'\\\\]|\\\\.)*'|\"(?:[^\"\\\\]|\\\\.)*\"/"; 
$str = "\"string 'c' \" string \" \" and ' string \"ste\" \' '"; 
preg_match_all($re, $str, $matches);

IDEONE demo

【讨论】:

  • 不错的解决方案,它通过了任意数量的连续反斜杠测试。
【解决方案2】:

这个正则表达式会做你想做的事,只是要注意你不能真正识别“you're”中的撇号与“you're string”之间的语义差异。

preg_match_all(
    "|(['\"])([^\"]*)(\1)|g",
    'This \'is a\' small "demo of what" you\'re trying, to "do"!'
);

参考

【讨论】:

  • 谢谢你。但是,我无法预见 PHP 文件中存在该示例,我可能遗漏了一些东西,但很好。
【解决方案3】:

这将匹配 " 和 ' 字符串:

/((?<!\\)["']).+?(?<!\\)\1/m

可以看正则表达式on this page的解释。

【讨论】:

  • This is the case 当你的正则表达式失败时(注意右边的 *\\* ")。我自己一直在使用look-behinds,直到我找到一个真正的解决方案。
  • @stribizhev 更正了正则表达式。第一个引用也需要一个负面的回顾。我认为它现在应该可以工作了。
  • 假设它会在没有转义实体的情况下工作,否则可能会产生意想不到的结果。
猜你喜欢
  • 2015-01-22
  • 2020-01-11
  • 1970-01-01
  • 2012-11-24
  • 2016-08-20
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多