Шаблон PHP Preg_replace () для замены только правильного текста, а не текста alt / src изображения

Я пытаюсь заменить первое вхождение строки "Harvey" ссылкой <a href='/harvey'>Harvey</a>

Я использую "/(?<!(src|alt|href)=\")".$internal_links_row['key_phrase']."/i" в качестве шаблона поиска, он пропускает совпадение только при наличии точного совпадения в шаблоне alt / src.

Например: соответствует alt="Harvey". Но не совпадает alt="James Stewart in Harvey",

Мне нужно пропустить каждое вхождение в двойные кавычки, и я не могу использовать strip_tags

Пожалуйста, помогите мне, ребята, спасибо


person Mr poppins    schedule 14.10.2013    source источник
comment
Спасибо Натану за редактирование :)   -  person Mr poppins    schedule 14.10.2013


Ответы (2)


Попробуйте использовать:

Harvey(?![^<>]*>)

Это гарантирует, что впереди нет закрывающей угловой скобки, указывающей на то, что он находится внутри тега HTML.

Если это не сработает, возможно, вместо этого положительный взгляд вперед:

Harvey(?=[^<>]*(?:<|\Z))

Это гарантирует, что впереди есть открывающаяся угловая скобка тега или конец строки.

Что означает:

"/".$internal_links_row['key_phrase']."(?![^<>]*>)/i"
"/".$internal_links_row['key_phrase']."(?=[^<>]*(?:<|\Z))/i"

соответственно

РЕДАКТИРОВАТЬ: Согласно комментарию:

"~".$internal_links_row['key_phrase']."(?=[^<>]*(?:<(?!/a)|\Z))~i"
 ^                                                  ^^^^^^     ^

Я изменил разделители и добавил отрицательный взгляд вперед.

person Jerry    schedule 14.10.2013
comment
Спасибо, Джерри, я воспользовался вторым методом, вроде отлично работает, проверяю внимательно .. - person Mr poppins; 14.10.2013
comment
@Mrpoppins Ой, я только что заметил опечатку. Регулярное выражение было бы лучше с (?:<|\Z), а не просто <|\Z. Прошу прощения за это ^^; - person Jerry; 14.10.2013
comment
Спасибо :), и было бы еще лучше, если бы мы также могли убедиться, что мы не заменяем текст, который уже находится внутри тега ‹a›. Какие-либо предложения? - person Mr poppins; 14.10.2013
comment
@Mrpoppins Хм, мне кажется, я тогда неправильно понял ваш вопрос. Не могли бы вы отредактировать свой вопрос и поместить строку ввода и желаемую строку вывода? - person Jerry; 14.10.2013
comment
<p>James Stewart in Harvey</p><img src="/i/harvey.jpg" alt="poster of harvey"><a href="/harvey">Harvey</a>. ЕСЛИ это ввод, мне нужно только заменить текст внутри <p> or <h1> or <div> or <span>. Ваш предыдущий код работает нормально. В качестве улучшения я хочу, чтобы он не заменял "harvey" в <a href="/harvey">Harvey</a>, чтобы он не стал <a href="/harvey"><a href="/harvey">Harvey</a></a> - person Mr poppins; 14.10.2013
comment
@Mrpoppins Привет, извините за задержку, мне нужно срочно сделать. Я обновил свой ответ сейчас. - person Jerry; 14.10.2013

почему бы не использовать str_replace()

$ans = str_replace('href="/harvey", 'href="/some_string"', $subject);
person gwillie    schedule 14.10.2013
comment
Я хочу заменить строку Харви, которая является правильным текстом, а не внутри ‹img› или другого тега. Например: ‹p› Харви - комедия 1950-х годов с Джеймсом Стюартом в главной роли ‹/p› ‹img src = harvey.jpg alt = JS в Харви›. Я хочу, чтобы Харви заменили только тогда, когда его нет внутри ‹img›. Но str_replace заменит его везде - person Mr poppins; 14.10.2013
comment
извините, чтобы отвлечься. Я бы использовал domdocument, регулярное выражение может быть непостоянным при разборе html. - person gwillie; 14.10.2013