正则表达式查找包含括号的字符串

时间:2018-01-04 17:52:02

标签: php regex

我有一个字符串数组,即文件路径。我想找到与查询匹配的所有路径。我的问题是其中包含()的文件会导致我使用的正则表达式无法使用这些文件。

所以,如果我有以下数组:

100 => "C:\xampp\htdocs\app\public\images/uploads/15150863248706/Dual Ring (1).gif"
101 => "C:\xampp\htdocs\app\public\images/uploads/15150863248706/Dual Ring (2).gif"
102 => "C:\xampp\htdocs\app\public\images/uploads/15150863248706/Dual Ring.gif"
103 => "C:\xampp\htdocs\app\public\images/uploads/15150864989651/Infinity (1).gif"
104 => "C:\xampp\htdocs\app\public\images/uploads/15150864989651/Infinity.gif"
105 => "C:\xampp\htdocs\app\public\images/uploads/15150865699474/Infinity (1).gif"
106 => "C:\xampp\htdocs\app\public\images/uploads/15150866060006/Infinity (1).gif"

因此,如果查询为Infinity (1).gif,则应返回103,105和106。

这就是我在PHP中使用的内容:

$query = 'Infinity (1).gif';
$files_found =  preg_grep('/\b'.$query.'\b/i', $files); //Files is the array of file paths

以下是我一直在使用的regex101的链接:https://regex101.com/r/poesBK/1

2 个答案:

答案 0 :(得分:3)

括号()在表示捕获组的正则表达式模式中具有特殊含义,因此必须对它们进行转义。您可以转义它们或使用preg_quote(),特别是如果可能有其他特殊字符,例如来自用户输入:

$files_found = preg_grep('/\b' . preg_quote($query, '/') . '\b/i', $files);

答案 1 :(得分:0)

您不需要正则表达式来查找另一个字符串中的特定字符串。 你可以做到以下几点:

<?php 

 $files = [
  'path/to/file/image (1).png',
  'path/to/file/image.png',
  'path/to/file/image (9).png',
  'path/to/file/JifOrGif.gif'   
 ];

 $search = 'image (1).png';

 foreach($files as $file) 
 {
  if(strpos($file,$search) !== 0)
  {

      echo 'FOUND ['. $file . '] !';

  }
 }