2013-10-26 4 views
2

Некоторое время назад я уже построил следующее регулярное выражение:Проблемы с регулярных выражений

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

Это соответствует каждый вид Cdkey-ххх это не внутри BBcode или HTML тега. Пока все работает.

Однако, я не могу заставить его работать должным образом, когда вы используете 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> 
+0

Может быть, вы используете что-то, что вы понятия не имеете, что он делает? Вы используете '(* SKIP) (* FAIL)', который скажет, что двигатель регулярных выражений завершится с ошибкой. В принципе, вам нужно удалить его. – HamZa

+0

'(* SKIP) (* FAIL)' используется только в регулярном выражении, которое работает;) Оно не используется в проблемном регулярном выражении. –

+0

lolwut, у вас есть 1 регулярное выражение. Поэтому по определению это будет «проблематичным», иначе вы не спросите. – HamZa

ответ

1

Проблема, которую я вижу с регулярным выражением является .* часть.

Вы не будете соответствуют силе наибольшее количество возможно через ваши матчи, и нет необходимости использовать модификатор s.

Если вы знаете, что ваш cdkey всегда будет цифрами и буквами, вы можете сделать что-то подобное.

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

См working demo

+0

избили меня +1 – HamZa

+0

Проблема в том, что cdkey может быть всем (включая звездочку, плюс, скобку и т. д.) –

+1

@ user2368182 Я никогда не видел такого ключа: o – HamZa

1

Я думаю, что границы слов \b не совместимы с синтаксисом у вас есть внутри них. В частности, дефис и последовательность с точечной звездой не будет соответствовать тому же, как это обычно бывает.

+0

Это именно то, что нужно использовать '\ b' для предотвращения ложных совпадений. Например, '\ bman \ b' будет соответствовать' это мужчина! ', Но он не будет соответствовать 'это полицейский!'. [См. Демонстрацию] (http://regex101.com/r/uM2lJ3) – HamZa

+1

@hamza отредактировал это. Спасибо за разъяснения. Просто. * Это не так. –

1

Если вы знаете, что может прекратить Cdkey, что-то вроде этого

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

\b cdkey \s* - \s* [^<>\[\]"'\s]* 
Смежные вопросы