【问题标题】:regex function[filename] pattern and function[string_with_escaped_characters] pattern正则表达式函数[文件名] 模式和函数[string_with_escaped_characters] 模式
【发布时间】:2012-08-18 12:35:49
【问题描述】:

我正在尝试编写脚本并解析文件,

请帮助使用 php 中的正则表达式来查找和替换以下模式:

来自:“这是 foo[/etc/bar.txt] 中的 foo[/www/bar.txt]”

致:“这是 bar2_txt_content 中的 bar_txt_content”

类似的东西:

$subject = "This is a foo[/www/bar.txt] within a foo[/etc/bar.txt]";
$pattern = '/regex-needed/';
preg_match($pattern, $subject, $matches);
foreach($matches as $match) {
    $subject = str_replace('foo['.$match[0].']', file_get_contents($match[0]), $subject);
}

我的第二个要求是:

来自:'这是一个 foo2[bar bar ] bar bar]。'

致:“这是一个返回”

类似的东西:

$subject = 'This is a foo2[bar bar \] bar bar].';
$pattern = '/regex-needed/';
preg_match($pattern, $subject, $matches);
foreach($matches as $match) {
    $subject = str_replace('foo2['.$match[0].']', my_function($match[0]), $subject);
}

请帮助构建这些模式...

【问题讨论】:

    标签: php regex preg-replace pattern-matching preg-match


    【解决方案1】:

    如果你总是有一个像 foo[ ... ] 这样的结构 那么就很简单了:

    foo\[([^]]+)\]
    

    这是 .NET 语法,但我确信表达式足够简单,您可以转换。

    正则表达式的描述:

    匹配字符“foo”字面意思是«foo» 匹配字符“[”字面意思«[» 匹配下面的正则表达式并将其匹配捕获到反向引用编号 1 «([^]]+)» 匹配任何不是“]”的字符«[^]]+» 在一次和无限次之间,尽可能多次,根据需要回馈(贪婪)«+» 匹配字符“]”字面意思«]»

    【讨论】:

    • 不允许转义]
    【解决方案2】:

    卢克,

    这应该可以帮助您入门。

    http://php.net/manual/en/function.preg-replace.php

    您可能必须设置一个循环并增加计数器,使用限制为 1 的 preg_replace 来仅替换第一个实例。

    为了匹配 foo[/www/bar.txt]: 正则表达式应该是这样的:

    foo\[\/www\/([A-Za-z0-9]*)\.txt\]
    

    反斜杠用于取消正则表达式中某些字符的特殊含义。

    它将匹配 foo[/www/.[some file name].txt,并且 ${1} 将包含不带 .txt 的文件名作为括号形成组,可以在替换表达式中使用。 ${1} 将包含第一个圆括号中匹配的内容,${2} 将包含第二个圆括号中匹配的内容,依此类推...

    因此,您替换的表达式应该类似于“${1}_txt_content”。或者在第二次迭代中“${1}2_txt_content”。

    [A-Za-z0-9]* 表示任何字母数字字符 0 次或多次,如果您需要至少 1 个字符,您可能需要将 * 替换为 +。

    那就试试吧:

    $pattern = foo\[\/www\/([A-Za-z0-9]*)\.txt\];
    $replace = "${1}_txt_content";
    $total_count = 1;
    do {
         echo preg_replace($pattern, $replace, $subject, 1, $count);
         $replace = "${1}" + ++$total_count + "_txt_content";
    } while ($count != 0);
    

    (警告,这是我的第一个 PHP 程序,所以它可能有错误,因为我无法测试它!但我希望你明白)

    希望有帮助!

    托尼

    PS:我不是 PHP 程序员,但我知道这可以在 C# 中工作,例如,查看 PHP 文档似乎应该可以工作。

    PS2:我总是将这个网站加入书签以供需要时参考:http://www.regular-expressions.info/

    【讨论】:

      【解决方案3】:
      $pattern = '/\[([^\]]+)\]/';
      preg_match_all($pattern, $subject, $matches);
      print_r($matches['1']);
      

      【讨论】:

      • cmets 不允许我做(斜线)+],但我需要允许转义
      • 允许将可选的(斜杠 - /)和(括号 - ])放在一起
      【解决方案4】:

      找到了我转义所需的正确正则表达式:

      '/foo\[[^\[]*[^\\\]\]/'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-11
        • 2019-08-09
        相关资源
        最近更新 更多