2

不久前,我构建了以下正则表达式:

~(?:<a.*?</a>|\[url.*?\[/url]|\[/?[^]]++]|</?[^>]++>)(*SKIP)(*FAIL)|\bcdkey\s*-\s*.*\b~is

这匹配所有不在 bbcode 或 html 标签内的 cdkey-xxx。到目前为止效果很好。

但是,当包含 bbcodes 和 html 标签时,我无法使其正常工作。我想,去掉前面的部分就足够了,但我似乎错了:

~\bcdkey\s*-\s*.*\b~is

有了这个正则表达式,

<a href="https://www.google.de/#q=cdkey-0192xdasas" class="externalURL">https://www.google.de/#q=cdkey-0192xdasas</a>

变成

<a href="https://www.google.de/#q=***>

[url]https://www.google.de/#q=cdkey-0192xdasas[/url]

变成

[url]https://www.google.de/#q=***]

而预期的结果是

<a href="https://www.google.de/#q=***" class="externalURL">https://www.google.de/#q=***</a>

[url]https://www.google.de/#q=***[/url]

我不知道如何解决这个问题。


所以,我试图实现的是替换

[url]https://www.google.de/#q=cdkey-0192xdasas[/url]
[url=https://www.google.de/#q=cdkey-0192xdasas]Test[/url]
[img]https://www.google.de/#q=cdkey-0192xdasas[/img]
[url="https://www.google.de/#q=cdkey-0192xdasas"]Test 3[/url]
https://www.google.de/#q=cdkey-0192xdasas
    Another plaintext cdkey   -   bla
<a href="https://www.google.de/#q=cdkey-0192xdasas" class="externalURL">https://www.google.de/#q=cdkey-0192xdasas</a>
<a href='https://www.google.de/#q=cdkey-0192xdasas'>Le Google</a>

[url]https://www.google.de/#q=***[/url]
[url=https://www.google.de/#q=***]Test[/url]
[img]https://www.google.de/#q=***[/img]
[url="https://www.google.de/#q=***"]Test 3[/url]
Plaintext https://www.google.de/#q=***
    Another plaintext ***
<a href="https://www.google.de/#q=***" class="externalURL">https://www.google.de/#q=***</a>
<a href='https://www.google.de/#q=***'>Le Google</a>
4

3 回答 3

1

如果你知道什么会终止 cdkey,像这样

 # \bcdkey\s*-\s*[^<>\[\]"'\s]*

 \b cdkey \s* - \s* [^<>\[\]"'\s]* 
于 2013-10-26T01:18:08.917 回答
1

我看到你的正则表达式的问题是.*部分。

您在匹配项中匹配了尽可能多的数量,无需使用s修饰符。

如果你知道你的cdkey总是数字和字母,你可以这样做。

$text = preg_replace('/cdkey\s*-\s*[a-z0-9]+/i', '***', $text);

查看工作演示

于 2013-10-26T00:42:59.377 回答
1

我认为单词边界\b与您在其中的语法不兼容。特别是连字符和点星序列不会像通常那样匹配。

于 2013-10-26T00:45:41.537 回答