Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.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 在单引号和双引号中捕捉';<;string>;';)_Php_Regex_Internationalization - Fatal编程技术网

Php 在单引号和双引号中捕捉';<;string>;';)

Php 在单引号和双引号中捕捉';<;string>;';),php,regex,internationalization,Php,Regex,Internationalization,我使用一个函数\uu()来翻译字符串,并添加了一个界面来自动查找所有文件中的所有这些翻译。这是(应该)使用以下正则表达式完成的: <?php $pattern = <<<'LOD' ` __\( (?<quote> # GET THE QUOTE (?<simplequote>') # catch the opening simple quote | (?<doubl

我使用一个函数
\uu()
来翻译字符串,并添加了一个界面来自动查找所有文件中的所有这些翻译。这是(应该)使用以下正则表达式完成的:

<?php
$pattern = <<<'LOD'
`
  __\(
    (?<quote>               # GET THE QUOTE
    (?<simplequote>')       # catch the opening simple quote
    |
    (?<doublequote>")       # catch the opening double quote
    )
    (?<param1>              # the string will be saved in param1
      (?(?=\k{simplequote}) # if condition "simplequote" is ok
        (\\'|"|[^'"])+      # allow escaped simple quotes or anything else
        |                   #
        (\\"|'|[^'"])+      # allow escaped double quotes or anything else
      )
    )
    \k{quote}             # find the closing quote
    (?:,.*){0,1}          # catch any type of 2nd parameter
  \)
  # modifiers:
  #  x to allow comments :)
  #  m for multiline,
  #  s for dotall
  #  U for ungreedy
`smUx
LOD;
 $files = array('/path/to/file1',);
 foreach($files as $filepath)
 {
   $content = file_get_contents($filepath);
   if (preg_match_all($pattern, $content, $matches))
   {
     foreach($matches['param1'] as $found)
     {
       // do things
     }
   }
 }
对于file1,我希望找到两个字符串,但只有双引号起作用


Edit添加了更多的php代码,以使测试更容易使用下面的正则表达式并从组索引2中获取所需的字符串

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

说明:

  • \uuu\(
    匹配文本
    \uuu\(
    字符)

  • (['”])
    捕获以下双引号或单引号

  • (?:\\\1 |(?!\1)。*
    匹配转义的双引号或单引号(引号基于组索引1中的字符)或
    不匹配捕获组中的字符
    (?!\1)。
    零次或多次

  • \1
    指第一个捕获组内的字符


阿维纳什·拉吉的解决方案更优雅,可能更高效(因此我验证了它),但我刚刚发现了我的错误,因此我将解决方案发布在这里:

<?php
$pattern = <<<'LOD'
`
  __\(
    (?<quote>               # GET THE QUOTE
    (?<simplequote>')       # catch the opening simple quote
    |
    (?<doublequote>")       # catch the opening double quote
    )
    (?<param1>              # the string will be saved in param1
      (?(simplequote)       # if condition "simplequote" 
        (\\'|[^'])+         # allow escaped simple quotes or anything else
        |                   #
        (\\"|[^"])+         # allow escaped double quotes or anything else
      )
    )
    \k{quote}               # find the closing quote
    (?:,.*){0,1}            # catch any type of 2nd parameter
  \)
  # modifiers:
  #  x to allow comments :)
  #  m for multiline,
  #  s for dotall
  #  U for ungreedy
`smUx
LOD;

你能在预期输出的同时发布一些有效和无效的示例吗?看看上面的答案提供了一个关于如何捕获转义序列的示例。我刚刚编辑了@AvinashRaj。我希望这足够感谢你的解释。这在演示中有效,但不在我的代码中…试图弄清楚你为什么能解释我这个:Ac根据doc(),我将
(?!\1)。
理解为“匹配任何东西(
),除非前面有一个引号”,它应该附加在引号后的第一个字符。我遗漏了什么?
(?!\1).
表示匹配任何字符
,但不匹配组索引1中的字符。如果组索引1包含双引号,
(?!\1)。
将匹配除双引号以外的任何字符。同样,对于单引号。。好的,非常感谢!我刚刚理解了前瞻的含义,即“休息一下。现在,让我们看看下一个角色是什么样子……允许吗?好的,你可以继续“
<?php
$pattern = <<<'LOD'
`
  __\(
    (?<quote>               # GET THE QUOTE
    (?<simplequote>')       # catch the opening simple quote
    |
    (?<doublequote>")       # catch the opening double quote
    )
    (?<param1>              # the string will be saved in param1
      (?(simplequote)       # if condition "simplequote" 
        (\\'|[^'])+         # allow escaped simple quotes or anything else
        |                   #
        (\\"|[^"])+         # allow escaped double quotes or anything else
      )
    )
    \k{quote}               # find the closing quote
    (?:,.*){0,1}            # catch any type of 2nd parameter
  \)
  # modifiers:
  #  x to allow comments :)
  #  m for multiline,
  #  s for dotall
  #  U for ungreedy
`smUx
LOD;