Негативный взгляд вперед не работает, как ожидалось

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

<?php

$tweet = "RT @Startup_Collab: @RiseOfRest is headed to OMA & LNK to #showcase our emerging #startup ecosystem. Learn more! https://example.net #Riseof…";

$patterns=array(
'/#\w+(?=…$)/',
);

$tweet = preg_replace_callback($patterns,function($m)
{
switch($m[0][0])
{
case "#":
return strtoupper($m[0]);
break;
}
},$tweet);echo $tweet;

Я хочу соответствовать любому хэштегу, за которым не следует …$ и в верхнем регистре это (в действительности это будет проанализировано с href но для простоты просто заглавные буквы на данный момент).

Это регулярные выражения с соответствующими выводами:

'/#\w+(?=…$)/' Совпадение с любым хэштегом, заканчивающимся на …$ и в верхнем регистре, работает как положено:

RT @Startup_Collab: @RiseOfRest is headed to OMA & LNK to #showcase our emerging #startup ecosystem. Learn more! https://example.net #RISEOF…

'/#\w+(?!…$)/' Соответствует любому хэштегу, НЕ заканчивающемуся на …$ и в верхнем регистре это, не работает, все хэштеги в верхнем регистре:

RT @Startup_Collab: @RiseOfRest is headed to OMA & LNK to #SHOWCASE our emerging #STARTUP ecosystem. Learn more! https://example.net #RISEOf…

Большое спасибо за любую помощь, предложения, идеи и терпение.

— ангел

1

Решение

Это связано с возвратом, который соответствует части хэштега. Используйте собственнический квантификатор, чтобы избежать возврата в \w+ подшаблон:

/#\w++(?!…$)/
^^

Увидеть regex demo

Теперь, 1 или более символов слова сопоставляются, и (?!…$) отрицательный прогноз выполняется только один раз после совпадения этих символов. Если есть ложный В результате обратного отслеживания не происходит, и весь матч не удался.

Смотрите больше на притяжательные квантификаторы Вот.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]