Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式以获取字符串中任意位置的speechmarks之间的字符串_Php_Regex - Fatal编程技术网

Php 正则表达式以获取字符串中任意位置的speechmarks之间的字符串

Php 正则表达式以获取字符串中任意位置的speechmarks之间的字符串,php,regex,Php,Regex,我正在做一个项目,在这个项目中,我试图在一个字符串中的任意位置提取两个speechmark之间的字符串。除了一件事,它几乎可以工作 假设我有电话 “04\/06\/2019 17:56:45:\t等待0秒读取日志“日志代理”的行 我将做两个正则表达式匹配,一个用于没有感叹号的字符串,例如,我将进行正则表达式搜索以匹配“耗时0秒”,另一个用于查找类似!“耗时0秒” 我使用下面的正则表达式来查找不以感叹号开头的字符串 $regex = '/[^.!](["\'])(?:(?=(\\\\?))\2.)

我正在做一个项目,在这个项目中,我试图在一个字符串中的任意位置提取两个speechmark之间的字符串。除了一件事,它几乎可以工作

假设我有电话

“04\/06\/2019 17:56:45:\t等待0秒读取日志“日志代理”的行

我将做两个正则表达式匹配,一个用于没有感叹号的字符串,例如,我将进行正则表达式搜索以匹配
“耗时0秒”
,另一个用于查找类似
!“耗时0秒”

我使用下面的正则表达式来查找不以感叹号开头的字符串

$regex = '/[^.!](["\'])(?:(?=(\\\\?))\2.)*?\1/m';
            $matches = null;
            preg_match_all($regex, $this->searchString, $matches, PREG_SET_ORDER, 0);
但是上面的正则表达式只匹配字符串,如果在字符串之前有什么东西,那么它没有找到任何东西

例如,如果搜索字符串为
“耗时0秒”
它找不到

如果是
其他一些内容“花费了0秒”
然后它在正则表达式匹配中正确地找到字符串
花费了0秒

因此,基本上我要问的是,我如何改变我的正则表达式,它可以在任何地方提取语音标记之间的字符串,即使它在开头是正确的

更新

我正在创建一个搜索解析器来查找数据库中的某些字符串

数据库中的搜索将查找单个关键字(与此问题无关,很容易完成)和数据库中的特定字符串。因此,如果我的搜索字符串
“花费了0秒“
,则数据库将返回任何包含记录的行
耗时0秒
。如果搜索字符串为
!“花了0秒”
然后我就可以检查数据库是否包含
花了0秒

如果我的搜索字符串是
keyword1关键字2“花了0秒”关键字3
然后正则表达式将返回
“花了0秒”

下面是一个链接,它给出了一些例子,问题是什么,你会注意到第一个例子,它只是“花了0秒”自己没有得到匹配

正如评论中所指出的,您可以使用负面查找,而不是匹配字符类中的字符

您可能要做的是更新您的模式,以便只使用第一个捕获组。当您的模式使用或解决方案时,该模式可能如下所示:

(?<![.!])(["'])(?:(?!\1).)*\1

什么是演讲词?如果你的意思是引用,那么你的例子似乎与这些无关。我已经更新了我的问题。希望我已经澄清了一点我不确定我是否理解的东西,但是消极的回顾怎么样:
(?如果你只是用这个正则表达式来代替
(花了[0-9]+秒)
?请看这里:@Thefourthbird这似乎是我正在追忆的东西,谢谢,太棒了
(?<![.!])(["\']).*?\1