0

I'm trying to find functionName('MATCH_1') ;, functionName( "MATCH2"); and ... functionName ('MATCH_X') ; and extract MATCH_XXX by the following text.

The text: Some text functionName('MATCH_1'); and other text functionName( "MATCH_2") ; and many another text.

Or many more in next line functionName( 'MATCH_X'); ... more text.

I want to get MATCH_1, MATCH2 and MATCH_X

My try:

<?php
preg_match_all('#functionName\s*\(\s*(\'|")(.*)(\'|")\s*\)\s*;#im', $content,$matches);

But my RegEx does not make what I want. Can you please explain me, as the RegEx must look like. And why he works like that.

regards raiserle

5
  • Can you provide $content in a reproducible format? Without an ^ or $ the m modifier is useless. Commented Feb 7, 2017 at 20:34
  • 2
    Replace .* with .*? or maybe even [^"\']* Commented Feb 7, 2017 at 20:35
  • @chris85: Why is the m useless? Commented Feb 7, 2017 at 20:57
  • 1
    @raiserle The m modifies how the ^ and $ interact with a line or string. php.net/manual/en/reference.pcre.pattern.modifiers.php If there are...no occurrences of ^ or $ in a pattern, setting this modifier has no effect. Commented Feb 7, 2017 at 21:30
  • @chris85:Thank you. My fault - I've read on other page, the m - modifier is for multi lines. Commented Feb 7, 2017 at 21:41

1 Answer 1

1

try this

$content = "The text: Some text functionName('MATCH_1'); and other text functionName( \"MATCH_2\") ; and many another text. Or many more in next line functionName( 'MATCH_X'); ... more text.";

preg_match_all('#functionName\s*\(\s*(\'|")(.*?)(\'|")\s*\)\s*;#im', $content,$matches);

var_dump($matches);

and then you should have what you want in $matches[2].

what i changed is i added the ? after the .* part of the regex, making it non-greedy (matching the shortest possible string instead of the longest match). This does make it less performant. See: here for an explanation of why and more detailed explanation.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you. ? after .* works exactly. The link is perfect. MATCH_1');?>functionName('MATCH2 is now correct.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.