0

他の方法でも同じ結果を得ることができるので、これは現在ほとんど学術的ですが…それは私を悩ませてきました、そして私は正規表現でどういうわけか可能であると確信しています。

PHPのpreg_replaceを使用して、コンテンツを置き換えたいと思います。

Content: “String <tag>This is some content, which contains newlines and quotation marks.</tag> and other unrelated content”.

Regex: /<tag>(.*)<\/tag>/sU

Replace: “String of other content, including matched pattern $1”

ただし、問題は、要素間に見つかった改行や引用符を削除したいということです。どの正規表現でこれを実行できますか?

4

3 に答える 3

1

PHPのpreg_replace()は、サブジェクトのワンパス処理を実行します。実際にはパターンと置換の配列を指定できますが、サブジェクト文字列の各部分に一致するのは1つだけです。この問題は通常の言語にはないため、単一の正規表現を使用した解決策は確かにありません。理論計算機科学は、そのようなタスクにはステートフルオートマチックが必要であることを教えています。正規表現は原始的です。

于 2012-10-04T13:58:58.993 に答える
0

arkaschaが指摘したように、これは実際には1回のパスで簡単に実行できる問題ではありません。

Perlでは1つのステップで実行できます。

use strict;
use warnings;
my $string = "blah <tag> foo \"bar \n </tag> baz";

$string =~ s/(?<=\<tag\>)([^<]+)(?=\<\/tag\>)/$_=$1;s|[\n\"]||gs;$_/ges;

print $string;

これは、Perlでコードを使用して置換文字列を生成できるという事実を利用しています。

PHPで同様のことができるかどうかはわかりません。とにかく、これは実際のコード設計としては適切ではありません。しかし、それは楽しいです。

于 2012-10-04T15:42:29.477 に答える
0

簡単ではありませんが、可能です。

このPHPコードを試してください:

function myFn($a, $b, $c) {
  $b = preg_replace("!(?:\\\'|[\"\n\r])!", '', $b);
  return "BEGIN " . $b . " END";
}
$s = "abc <tag>def \n ghi 'jkl' mno \"pqr\" stu</tag> vwx";
$s = preg_replace('!(<tag>)(.*?)(</tag>)!ise', 'myFn("$1", "$2", "$3")', $s);
print $s;

出力:

abc BEGIN def  ghi jkl mno pqr stu END vwx

ここでこのコードをテストします。

于 2012-10-04T16:24:13.453 に答える