PHP Regex matches words in a string excluding one specific word

I have text ($ txt), an array of words ($ words), I want to add a link and a word ($ wordToExclude), which should not be replaced.

$words = array ('adipiscing','molestie','fringilla');
$wordToExclude = 'consectetur adipiscing';


$txt = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque
mattis tincidunt dolor sed consequat. Sed rutrum, mauris convallis bibendum 
dignissim, ligula sem molestie massa, vitae condimentum neque sem non tellus.
Aenean dolor enim, cursus vel sodales ac, condimentum ac erat. Quisque
lobortis libero nec arcu fringilla imperdiet. Pellentesque commodo, 
arcu et dictum tincidunt, ipsum elit molestie ipsum, ut ultricies nisl
neque in velit. Curabitur luctus dui id urna consequat vitae mattis
turpis pretium. Donec nec adipiscing velit.'

I want to get this result:

$txt = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque
mattis tincidunt dolor sed consequat. Sed rutrum, mauris convallis bibendum 
dignissim, ligula sem <a href="#">molestie</a> massa, vitae condimentum neque sem non tellus.
Aenean dolor enim, cursus vel sodales ac, condimentum ac erat. Quisque
lobortis libero nec arcu <a href="#">fringilla</a> imperdiet. Pellentesque commodo, 
arcu et dictum tincidunt, ipsum elit <a href="#">molestie</a> ipsum, ut ultricies nisl
neque in velit. Curabitur luctus dui id urna consequat vitae mattis
turpis pretium. Donec nec <a href="#">adipiscing</a> velit.'
+5
source share
3 answers
$result = preg_replace(
    '/\b                 # Word boundary
    (                    # Match one of the following:
     (?<!consectetur\s)  #  (unless preceded by "consectetur "
     adipiscing          #  adipiscing
    |                    # or
     molestie            #  molestie
    |                    # etc.
     fringilla
    )                    # End of alternation
    \b                   # Word boundary
    /ix', 
    '<a href="#">\1</a>', $subject);
+3
source

Okey doke! Although I think this is technically feasible, the solutions I provided at this point are soft:

s%(?!consectetur adipiscing)(adipiscing|molestie|fringilla)(?<!consectetur adipiscing)%<a href="#LinkBasedUpon$1">$1</a>%s

it turns out ...

sit amet, consectetur adipiscing elit. Quisque ... ligula sem molestie massa ... nec arcu fringilla imperdiet ... nec adipiscing velit.

at...

sit amet, consectetur adipiscing elit. Quisque... ligula sem <a href="#LinkBasedUponmolestie"> molestie </a> massa... nec arcu <a href="#LinkBasedUponfringilla"> fringilla </a> imperdiet... nec <a href="#LinkBasedUponadipiscing"> adipiscing </a> velit.

, , , , , . , "" (.. consectetur adipiscing elit), adipiscing consectetur adipiscing elit, adipiscing , consectetur adipiscing elit

, "word" (A B C) , (C|X|E C , A B C C, ...)

{

, " " , , lookbehind , , , ( ?)

}

, , , - , . , !

+2

, PHP. , ARRAY , , . , . , , , , , , , :

:

  • preg_match_all, ( (strlen) PREG_OFFSET_CAPTURE preg_match_all, - )
  • foreach preg_match_all, , .
  • , 2, , 1, , ,

, , , , , .

0

All Articles