webForumDet fria alternativet

preg_match_all - hur ska mitt regexp se ut?

PHP

14 svar · 1 855 visningar · startad av webbo

Medlem sedan maj 201131 inlägg
Frågan#1

Jag vill kolla igenom ett kodstycke och hitta alla förekomster av några funktioner (mail_to, link_to, link_to_funktion).

Hur ska mitt regexp se ut?

Jag har testat följande men det fungerar inte:


// Exempel
$str = "Bla bla <?php echo mail_to('test@test.com') ?> bla bla <?php echo link_to_funktion('Alert', 'alert(\'Hej!\')') ?> bla bla bla <?php echo link_to('test.html') ?> bla bla bla";

preg_match_all
(
	"/mail_to|link_to|link_to_function\(\'(.*)\'\)/",
	$str,
	$matches
);

Det är alltså det innanför "funktions-paranteserna" jag vill få ut... I exemplet ovan: test@test.com, Alert och test.html

Tack för hjälpen!

Medlem sedan jan. 2005953 inlägg
#2
<?php
// Exempel
$str = "Bla bla <?php echo mail_to('test@test.com') ?> bla bla <?php echo link_to_funktion('Alert', 'alert(\'Hej!\')') ?> bla bla bla <?php echo link_to('test.html') ?> bla bla bla";

preg_match_all
(
    "/(mail_to|link_to|link_to_function)\(\'(.*?)\'\)/",
    $str,
    $matches
);

echo '<pre>';
print_r($matches);
echo '</pre>';

Det du vill ha ut finns i $matches[2]

Medlem sedan maj 201131 inlägg
#3

Tack för snabbt svar! Aha, man måste alltså ha parenteser där också i mitt regexp...

Nu har jag ett problem dock. Det kan ju vara två stycken parametrar i funktionsanropet. Det är bara den första jag vill ha och den omgärdas av antingen ' eller "

Hur göra?

Medlem sedan maj 201131 inlägg
#4

Någon som har koll på detta?

Medlem sedan juni 20122 inlägg
#5

Testa med

(mail_to|link_to|link_to_function)\([\'|\"]([^\'|\"|\,|\)]*)
Medlem sedan maj 201131 inlägg
#6

Aisee skrev:

Testa med

(mail_to|link_to|link_to_function)\([\'|\"]([^\'|\"|\,|\)]*)

Tack Aisee, det fungerar bra!

Om jag nu även vill ta till vara på den andra parametern, hur ska mitt regexp se ut då?

Medlem sedan maj 201131 inlägg
#7

Någon?

Jag vill alltså söka rätt på alla förekomster av funktionsanropen mail_to, link_to och link_to_function i en lång textsträng och få tag i anropens parametrar (kan vara en eller två parametrar per anrop).

Exempel:

$str = "Bla bla bla <?php echo link_to('test', 'test2') ?> bla bla bla <?php echo link_to_function('hej', 'hej2') ?> bla bla bla...";

preg_match_all
(
    ?,
    $str,
    $matches
);

Ska alltså returnera:

$matches = array
(
  [0] => array
  (
    [0] => "link_to('test', 'test2')"
    [1] => "link_to_function('hej', 'hej2')"
  )
  [1] => array
  (
    [0] => "test"
    [1] => "hej"
  )
  [2] => array
  (
    [0] => "test2"
    [1] => "hej2"
  )
)

Parametrarna (en eller två per anrop) kan vara omgärdade av antingen enkelfnutt ' eller dubbelfnutt ". Innanför fnuttarna ska alla tecken vara tillåtna.

Hur ska mitt regexp se ut?

Tack för hjälpen!

Medlem sedan maj 201131 inlägg
#8

Ingen som vet?

Medlem sedan maj 201131 inlägg
#9

Jag har kommit så här långt:

$regexp = "/(mail_to|link_to|link_to_function)\((\'|\")(.*?)(\'\)|\"\)|\'\,|\"\,)/";

men hur gör jag för att även ta reda på den andra parametern, om en sådan finns dvs...?

Medlem sedan maj 201131 inlägg
#10

Jag lyckas inte lösa detta själv... Ingen här på wf som har koll på regexp av denna typ?

Medlem sedan juni 20019 519 inlägg
#11

Känns som du få göra två regex uttryck om du nu skall ha fler parameter eller få du väl splitar parametern på , och jobba med den

Få kolla på det när jag sitter vid en dator

Medlem sedan maj 201131 inlägg
#12

voigtann1 skrev:

Känns som du få göra två regex uttryck om du nu skall ha fler parameter eller få du väl splitar parametern på , och jobba med den

Tack för ditt svar, äntligen någon som besöker PHP-forumet ;)

Borde väl gå att få det i en och samma regexp tycker jag... Det kan vara fler än två parametrar men det är bara de två första jag är ute efter.

Medlem sedan maj 201131 inlägg
#13

Kan det här vara något kanske?

$regexp = "/(mail_to|link_to|link_to_function)\((\'|\")(.*?)(\'\)|\"\)|\'\,|\"\,)((.?)(\'|\")(.*?)(\'|\"))?/";

Tycks funka, men borde gå att göras snyggare?

Nu blir det en väldigt lång resultat-array ($matches). Kan man rensa den lite kanske? Eller i alla fall bestämma ordningen?

Medlem sedan juni 20019 519 inlägg
#14

nu kan jag inte php så extremt bra men vad har du för sträng för att testa? men ditt uttryck är jätte stor och omständig, kan du ge ett exempel på kod och vad du vill få för resultat på $matches? är det alltid 2 parameter i mail_to link_to link_to_function? eller hur vill du egentligen att man skall få ut varje matchning, tror inte det gå att få det dynamiskt men:

<?php
$str = "Bla bla bla <?php echo link_to('test', 'test2') ?> bla bla bla <?php echo link_to_function('hej', 'hej2') ?> bla bla bla...";
$var = "['\"](.*?)['\"]";
$para = "(?:".$var."(?:, ?".$var.")?)";
$regexp = "/(?:mail_to|link_to|link_to_function)\(".$para."\)/";
preg_match_all
(
    $regexp,
    $str,
    $matches
);

echo '<pre>';
print_r($matches);
echo '</pre>'; 
?>

Ge dig:

Array
(
    [0] => Array
        (
            [0] => link_to('test', 'test2')
            [1] => link_to_function('hej', 'hej2')
        )

    [1] => Array
        (
            [0] => test
            [1] => hej
        )

    [2] => Array
        (
            [0] => test2
            [1] => hej2
        )

)
Medlem sedan maj 201131 inlägg
#15

Tack!

258 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)