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

そして私の2番目の要求は持っていることです:

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

これらのパターンの構築にご協力ください...

4

4 に答える 4

0

エスケープに必要な正しい正規表現を見つけました:

'/foo\[[^\[]*[^\\\]\]/'
于 2012-08-18T13:44:34.517 に答える
0

リュック、

これは、開始するのに役立ちます。

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

最初のインスタンスのみを置き換えるには、preg_replace を制限 1 で使用して、ループをセットアップしてカウンターを増やす必要がある場合があります。

foo[/www/bar.txt]: と一致させるには、正規表現は次のようにする必要があります。

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

バックスラッシュは、正規表現の一部の文字の特別な意味をキャンセルするためにあります。

これは foo[/www/.[some file name].txt に一致し、${1} には .txt のないファイル名が含まれます。これは、置換された式で使用できるグループを形成するブラケットとしてです。${1} には最初の丸括弧で一致したものが含まれ、${2} は 2 番目のもので一致したものが含まれます。

したがって、置換された式は「${1}_txt_content」のようになります。または、2 回目の繰り返しで「${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: 必要なときに参照できるように、この Web サイトを常にブックマークしておきます: http://www.regular-expressions.info/

于 2012-08-18T12:44:14.153 に答える
0

If you always have a structure like foo[ ... ] Then is very easy:

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

That is .NET syntax but i'm sure the expressions is simple enough for you to convert.

Description of the regex:

Match the characters “foo” literally «foo» Match the character “[” literally «[» Match the regular expression below and capture its match into backreference number 1 «([^]]+)» Match any character that is NOT a “]” «[^]]+» Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» Match the character “]” literally «]»

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