1

I try to get all tags name from code:

$str = "Lorem ipsum [B]dolor[/b] sit amet, consectetur adipiscing elit. Aenean vestibulum orci sed ante malesuada vulputate. [Link]In tempus[/Link], lacus eu luctus fringilla, ligula dui scelerisque justo, sit amet mollis velit turpis a nunc. Pellentesque interdum risus quis nisl vestibulum congue. Nam vel dolor [i]sit[/i] amet urna eleifend consequat eget tincidunt neque. Maecenas sed justo sed dolor rhoncus malesuada. Maecenas ut mauris eu sem auctor viverra eu non mi. Duis in enim nec orci molestie facilisis. Vivamus sit amet maecenas porttitor urna. Maecenas cursus fermentum bibendum. Sed a nulla lectus, nec eleifend magna. Sed eu turpis non tortor ornare vestibulum eu eget risus.";


$expr= '~' . '(\[[a-z]+\])' . '([a-z]*)' . '/\1' . '~iU';
$result = preg_match_all($expr, $str, $found);

But I got 3 empty arrays, I suppose that last '/\1' is invalid, but failed to fix it... Which expression is valid?

Thanks in advance!

Petro Gromovo
  • 1,755
  • 5
  • 33
  • 91
  • What language is this? What is your expected result? And your first "Tag" seems to have different casing, does this matter? – derpirscher Apr 30 '23 at 06:48
  • 2
    Regex aren't suited for that, things are going to be very complicated once you'll get nested tags, `[b]hello [i]world[/i][/b]`. Use a proper parser instead, there's probably one for the markup language you're using (bbcode?) – Cid Apr 30 '23 at 07:00

1 Answers1

2

You may use this regex and grab capture group #1 for the tag name:

(?i)\[(\w+)].*?\[/\1]

RegEx Demo

RegEx Details:

  • (?i): Enable ignore case mode
  • \[: Match [
  • (\w+): Match 1+ word characters and capture it in group #1
  • ]: Match ]
  • .*?: Match 0 or more of any characters
  • \[: Match [
  • /\1: Match / followed by the the value capture in group #1
  • ]: Match ]

Code Demo

Code:

$str = "Lorem ipsum [B]dolor[/b] sit amet, consectetur adipiscing elit. Aenean vestibulum orci sed ante malesuada vulputate. [Link]In tempus[/Link], lacus eu luctus fringilla, ligula dui scelerisque justo, sit amet mollis velit turpis a nunc. Pellentesque interdum risus quis nisl vestibulum congue. Nam vel dolor [i]sit[/i] amet urna eleifend consequat eget tincidunt neque. Maecenas sed justo sed dolor rhoncus malesuada. Maecenas ut mauris eu sem auctor viverra eu non mi. Duis in enim nec orci molestie facilisis. Vivamus sit amet maecenas porttitor urna. Maecenas cursus fermentum bibendum. Sed a nulla lectus, nec eleifend magna. Sed eu turpis non tortor ornare vestibulum eu eget risus.";
 
if (preg_match_all('~(?i)\[(\w+)].+?\[/\1]~', $str, $m)) {
    print_r ($m[1]);
}

Output:

Array
(
    [0] => B
    [1] => Link
    [2] => i
)
anubhava
  • 761,203
  • 64
  • 569
  • 643