开发者

PHP Regex question

I'm trying to par开发者_StackOverflowse some text for example:

$text = "Blah blah [a]findme[/a] and [b]findmetoo[b], maybe also [z]me[/z].";

What I have now is:

preg_match_all("/[*?](.*?)[\/*?]/", $text, $matches);

Which doesn't work unfortunately.

Any ideas how to parse, return the node key and the corresponding node value?


Well firstly by you not putting () around your *? your not matching the tag name, and secondly, using [*?] will match multiple [ until the ] where you want to match inside, so you should be doing [(.*?)] and [\/(.*?)]

You would have to try something along the lines of:

/\[(.*?)\](.*?)\[\/(.*?)\]/is

this is not guaranteed to work but will get you closer.

you could also do:

/\[(.*?)\](.*?)\[\/\1\]/is

and then foreach result loop recursively until preg_match_all returns false, that's a possible way how to do nesting.


In order to match the same tags, you need a backreference:

This assumes no nesting, if you need nesting then let me know.

$matches = array();
if (preg_match_all('#\[([^\]]+)\](.+?)\[/\1\]#', $text, $matches)) {
   // $matches[0] - entire matched section
   // $matches[1] - keys
   // $matches[2] - values
}

Incidentally, I do not know what you are going to do with this bbcode style work, but usually you would want to use preg_replace_callback() to deal with inline modification of this sort of text, with a regexp similar to the above.


Try:

$pattern = "/\[a\](.*?)\[\/a\]/";
$text = "Blah blah [a]findme[/a] and [b]findmetoo[b], maybe also [z]me[/z].";
preg_match_all($pattern, $text, $matches);

That should point you in the right direction.


I came up with this regex ((\[[^\/]\]).+?(\[\/[^\/]\])). Hope will work for you


I'm no regex monkey, but I think you need to escape those brackets and create groups to search for, as brackets don't return results (parentheses do):

preg_match_all("/\\[(*?)\\](.*?)\\[\(\/*?)\\]/", $text, $matches);

Hope this works!


Should your second example also be captured even though the [b] "tag" is not closed with the [\b] backslash 'b'. If tags should be properly closed then use

/\[(.*?)\](.*?)\[\/\1\]/

This will ensure that opening and closing tags match.


You can try this:

preg_match_all("/\[(.*?)\](.*?)\[\/?.*?\]/", $text, $matches);

See it

Changes made:

  • [ and ] are regex meta-characters used to define character class. To match literal [ and ] you need to escape them.
  • To match any arbitrary text(without newline) in non-greedy way you use .*?.
  • To match the node key you need to enclose the pattern matching it in (..) so that they get captured.
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜