现在这主要是学术性的,因为我可以通过其他方式获得相同的结果,但是...它一直在困扰我,我确信它可能以某种方式使用正则表达式。
我想使用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”
但问题是,我想删除元素之间的任何换行符和/或引号。什么正则表达式允许我这样做?
答案 0 :(得分:1)
PHPs preg_replace()对主题进行一次处理。您实际上可以指定模式和替换的数组,但是只有一个将匹配主题字符串的每个部分。肯定没有使用singel正则表达式的解决方案,因为这个问题不在常规语言中。理论计算机科学教导你需要一个有状态的自动机来完成这样的任务。正则表达式是原始的。
答案 1 :(得分: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中是否可以做类似的事情。无论如何,这不是一个好的真实代码设计。但它很有趣。
答案 2 :(得分: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
测试此代码here。