小编Ger*_*ols的帖子

php preg_replace 为每个捕获组分配不同的替换模式

我正在尝试以布尔模式执行 mysql 全文搜索,并且需要在构建 mysql 查询之前准备搜索文本。

为了实现这一目标,我认为我可以使用 PHP 函数preg_replace并用一种特定模式替换每个捕获组。

  1. 第一个模式必须找到引号 ( "hello world") 之间的单词或句子并在前面添加+( +"hello world")。
  2. 第二个模式必须找到其余单词(不带引号)并添加+前后*( +how*)。

正则表达式模式

["']+([^"']+)["']+|([^\s"']+)
Run Code Online (Sandbox Code Playgroud)

替代模式

+"\1" +\2*
Run Code Online (Sandbox Code Playgroud)

例子

对于以下输入:

"hello world" how are you?
Run Code Online (Sandbox Code Playgroud)

它应该返回:

+"hello world" +how* +are* +you?*
Run Code Online (Sandbox Code Playgroud)

但相反,它返回一些“错误”的东西

+"hello world" +* +"" +how* +"" +are* +"" +you?*
Run Code Online (Sandbox Code Playgroud)

我知道替换模式+"\1" +\2*永远不会起作用,因为我没有告诉任何地方+"..."应该只适用于第一个捕获组和+...*第二个捕获组。

测试在线正则表达式

PHP代码

$query = preg_replace('~["\']+([^"\']+)["\']+|([^\s"\']+)~', '+"\1" +\2*', $query);
Run Code Online (Sandbox Code Playgroud)

有没有办法在 PHP 中实现这一点?先感谢您。


编辑/解决方案

感谢 …

php regex sql-injection preg-replace capturing-group

3
推荐指数
1
解决办法
1448
查看次数