I have many strings enclosed within a function called trans. In some places it could be trans(‘Hello’) or trans(“Hello”) I want to write a regular expression that returns only Hello in both cases.
trans('|"(.*?)'|")
This is what I came up with but it doesn’t work in my code. Returns other strings as well with single or double quotes. I am using the above in a preg_match_all function as I have to had to escape the single quotes in my regex.
I could also have a string like this within the trans function “It’s never happened”
Advertisement
Answer
You need to keep a copy of the opening quotation mark and use it to match the closing quotation mark at the end of the matched string. If back-references worked inside character classes, you could do that with an expression like /trans((['"])([^1]*)1)/
, but instead you have to use a negative lookahead — replace [^1]*
with ((?!1).)*
.
Try this:
<?php $a = <<<END trans("Double-quoted string") trans('Single-quoted string') trans("Apostrophes shouldn't be a problem") END; if (preg_match_all('/trans((['"])(((?!1).)*)1)/', $a, $matches) > 0) { foreach ($matches[2] as $m) echo "$mn"; } else echo "No matchn";