Выражение регулярного выражения для исключения слов, окруженных специальными символами - PullRequest
0 голосов
/ 29 февраля 2020

У меня были проблемы с поиском решения загадки регулярного выражения, которое у меня есть.

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

Например, если дана строка

This is a test string

Я могу заменить слово «тест» на

<a target="_blank"  href="https://website.com/string-random“>test</a>. 

Полученная строка должна выглядеть следующим образом

This is a <a target="_blank" href="https://website.com/string-random“>test</a> string

Замена слов производится в al oop

foreach ($documents as $document)
 
    foreach ($links as $link)
        replace keywords

Что в итоге происходит в некоторых сценариях ios - некоторые URL-адреса в тегах привязки содержат слова, которые потенциально может быть заменен

Например, если заменить этот список слов

[
    {
        'keyword': 'test',
        'link': 'https://website.com/string-random'
    },
    {
        'keyword': 'string',
        'link': 'https://random.com/string'
    }
]

После того, как все замены выполнены, приведенная выше примерная строка будет выглядеть так:

This is a <a target="_blank" href="https://website.com/<a target="_blank"  href="https://random.com/string“>string</a>-random“>test</a> <a target="_blank" href="https://random.com/string“>string</a>

Вместо

This is a <a target="_blank" href="https://website.com/string-random“>test</a> <a target="_blank" href="https://random.com/string“>string</a>

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

Также очень открыт для любых других идей о том, как решить эту проблему

Ответы [ 3 ]

0 голосов
/ 01 марта 2020

Попробуйте:

foreach ($wordlist as $word){
     $document = preg_replace("~(?! )($word[keyword])(?! )~i","<a href='$word[link]'>$1<")
}
0 голосов
/ 25 марта 2020

Я нашел шаблон, который работает очень хорошо для меня слышать $pattern = '/(?<!(>|\/|-))\b' . preg_quote($stringToReplace, '/') . '\b(?!(<|\/|-))/i';

0 голосов
/ 29 февраля 2020

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

Другими словами, вы хотите заменить строки, которые следуют за некоторыми символами, где следующий < происходит перед следующим> (строки между тегами, а не внутри тегов)

Следовательно попробуйте следующее: (string-to-match)(?=[^>]*?<)

(очевидно, заменить строку на соответствующую)

другой блок - заглядывание вперед: он гарантирует, что вы можете прочитать любой символ, но>, столько раз, сколько необходимо, затем <</p>

...