0

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

请帮助使用 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]。'

To:“这是一个返回”

沿着这些思路:

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

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

4

4 回答 4

0

卢克,

这应该可以帮助您入门。

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/

于 2012-08-18T12:44:14.153 回答
0

如果你总是有一个像 foo[ ... ] 这样的结构,那么很容易:

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

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

正则表达式的描述:

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

于 2012-08-18T12:45:04.743 回答
0
$pattern = '/\[([^\]]+)\]/';
preg_match_all($pattern, $subject, $matches);
print_r($matches['1']);
于 2012-08-18T12:48:10.163 回答
0

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

'/foo\[[^\[]*[^\\\]\]/'
于 2012-08-18T13:44:34.517 回答