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

PHPs preg_replace() 对主题进行一次性处理。您实际上可以指定一组模式和替换,但是主题字符串的每个部分只有一个匹配。使用单个正则表达式当然没有解决方案,因为这个问题不在常规语言中。理论计算机科学告诉你,你需要一个有状态的自动机来完成这样的任务。正则表达式是原始的。

于 2012-10-04T13:58:58.993 回答
0

正如 arkascha 指出的那样,这并不是一个可以一次性轻松完成的问题。

它可以在 Perl 中一步完成:

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 回答