I'm playing around with the WP editor and I'd like to create a RegEX pattern that matches everything outside the square brackets like this:

[foo]Some selected text here[/foo]More selected text here

And replace with

[foo][text_box text="Some selected text here"][/textbox][/foo]
[text_box text="More selected text here"][/textbox]

I managed to match the square brackets content using

(\[(.*?)\])

How can I match everything else?

Thank you very much for your help!

有帮助吗?

解决方案

Can your text contain [?

If not you can use something in the spirit of

((?:\s*\[[^\]]+\])*)([^[]+)((?:\[[^\]]+\]\s*)*)

(                    # first capturing group
    (?:              # non capturing group
        \s*          # might be whitespaces
        \[           # opening [
        [^\]]+       # anything except a closing ]
        \]           # closing ]
    )*               # zero or more times
)
([^[]+)              # store in second capturing group any string that doesn't contain a [
((?:\[[^\]]+\]\s*)*) # catch tags in capture group 3

and replace it with

$1[text_box text="$2"][/textbox]$3

The idea is to catch the text that doesn't contain a [. When we stop, we know the next character will a [, so this is a tag, so we catch every consecutive [...] tags. Afterwards it's text again, so we reapply the pattern.

The "tag capture" before the text will only be used once, if the string starts with tags.

See demo here

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top