У меня странная ситуация, когда позитивный взгляд работает как положено, но негативный взгляд не делает. Пожалуйста, взгляните на следующий код:
<?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…
Большое спасибо за любую помощь, предложения, идеи и терпение.
— ангел
Это связано с возвратом, который соответствует части хэштега. Используйте собственнический квантификатор, чтобы избежать возврата в \w+
подшаблон:
/#\w++(?!…$)/
^^
Увидеть regex demo
Теперь, 1 или более символов слова сопоставляются, и (?!…$)
отрицательный прогноз выполняется только один раз после совпадения этих символов. Если есть ложный В результате обратного отслеживания не происходит, и весь матч не удался.
Смотрите больше на притяжательные квантификаторы Вот.
Других решений пока нет …