regex函数[filename]模式和函数[string_with_escaped_characters]模式



我正在尝试编写和解析一个文件

请帮助在php中使用regex来查找和替换以下模式:

发件人:"这是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);
}

我的第二个要求是:

From:'这是一个foo2[酒吧]酒吧]。'

收件人:"这是退回的"

类似的东西:

$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);
}

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

如果你总是有一个类似foo的结构[…]然后很容易:

foo[([^]]+)]

就是这样。NET语法,但我相信表达式足够简单,可以进行转换。

正则表达式的描述:

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

Luc,

这应该有助于你开始。

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文件名].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程序,所以它可能会有错误,因为我无法测试它!但我希望你明白这个想法)

希望能有所帮助!

Tony

附言:我不是PHP程序员,但我知道这在C#中有效,例如,看看PHP文档,它似乎应该有效。

PS2:我总是把这个网站作为书签,以便在需要时参考:http://www.regular-expressions.info/

$pattern = '/[([^]]+)]/';
preg_match_all($pattern, $subject, $matches);
print_r($matches['1']);

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

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

最新更新