Gå til innhold

RegEx bug, preg_match_all macther ikke og outputter ikke


Anbefalte innlegg

Skrevet

Hei, Har et problem med en kode her, får ikke mitt RegEx til å virke tilstrekkelig når det er i bruk spesielle tegn som "=" og "<" og det fungerer ikke å putte \ forran de.

 

$source = "Randomtext<a href=\"test.php\">some text</a>rtext";
preg_match_all("/<a href=/", $source, $out);

echo var_dump($out);

 

Output =

array(1) { [0]=> array(1) { [0]=> string(8) "

 

og hvis jeg endrer "/<a href=/" til "/a href/" blir dette output:

 

array(1) { [0]=> array(1) { [0]=> string(6) "a href" } }

 

Hva skal jeg gjøre? o_O

Videoannonse
Annonse
Skrevet

Hva er i grunn poenget med å bruke regulære uttrykk her? Man skulle jo tro strpos fungerer bra her. Uansett, escapetegnet i regex er \ ev. kan man bruke preg_quote også.

Skrevet

For spørre dumt, har du husket å sjekke kildekoden i nettleseren? For <a href= vil jo ikke vises siden det er html

Jeg får

array(1) {
 [0]=>
 array(1) {
   [0]=>
   string(8) "<a href="
 }
}

med preg_match_all("/<a href=/", $source, $out);

Skrevet

Det der er ett eksempel på hvor jeg ikke får det til å fungere. Og som du ser kreves det ikke noe escape i eksempelet.

Sist jeg sjekket var nå både < og = spesialtegn i regex. Kjører du det igjennom preg_quote så blir < til \< og = til \= iallfall ;)
Skrevet

Ja har sjekket i nettleser, vet dette fungerte før da jeg har brukt det før og baserer den nye koden på en eldre kode jeg har skrevet som fungerte glimrende i sin tid. Men siden jeg bruker den mot har endret system og jeg må rekode det.

 

< og = er ikke regnet som spesialtegn, for å teste teorien kan du teste den på http://regjex.com/ der fungerer alt ved stringen min, men ikke når jeg kjører det gjennom php her og aner ikke hvorfor.

 

Ja har prøvd å escape disse tegnene men det hjelper ikke.

Skrevet

< og = er ikke regnet som spesialtegn, for å teste teorien kan du teste den på http://regjex.com/ der fungerer alt ved stringen min, men ikke når jeg kjører det gjennom php her og aner ikke hvorfor.

 

Ja har prøvd å escape disse tegnene men det hjelper ikke.

Nei, det kan nok godt hende det ikke er nødvendig når de ikke bruker i rett kontekst, men at de ikke er spesialtegn er sludder og vås. Noen gang hørt om «assertions» når det kommer til regulære uttrykk? F.eks. er «lookbehind assertion» ?<=

preg_match("/(?<=foo)bar/", "foobar", $out);
var_dump($out);

Ergo, det er spesialtegn ;)

Skrevet

joa, men mente det ikke var nødvendig. Uansett det løser ikke problemet mitt og jeg skjønner faen ikke hva som er bugga med php her :S Noen som har en anelse?

Skrevet

joa, men mente det ikke var nødvendig. Uansett det løser ikke problemet mitt og jeg skjønner faen ikke hva som er bugga med php her :S Noen som har en anelse?

Det spørs jo hva du forventer da. Koden i første post gir hos meg:

array(1) {
 [0]=>
 array(1) {
[0]=>
string(8) "<a href="
 }
}

Skrevet

Kommandolinje og PHP 5.4.6. Regner i grunn med at det her bare skyldes at du viser det i en nettleser. Putter du en pre-tag rundt det hele så burde du se det samme resultatet som jeg gjør.

Skrevet (endret)

Det fungerer jo helt fint sånn jeg ser det. Det som skjer er jo at når du viser dette i en nettleser (som antagelig HTML) så åpner du en a-tag uten å lukke den. Ergo vil jo mye rart skje.

 

… men prøv dette da:

$source = "Randomtext<a href=\"test.php\">some text</a>rtext";
preg_match_all("/<a href=/", $source, $out);
echo "<pre>";
var_dump($out);
echo "</pre>";

Endret av Ernie
Skrevet (endret)

Det er ikke nok med pre tagger rundt, <a href= vil fortsatt bli oppfattet som html og dermed ikke vist. Sjekk kildekoden i nettleseren (høyre klikk -> view source) eller

$source = "Randomtext<a href=\"test.php\">some text</a>rtext";
preg_match_all("/<a href=/", $source, $out);

echo htmlentities($out[0][0]); // <a href=

for å skrive ut $out[0][0] i "ikke html"

Endret av Crowly
Skrevet

Takk for alle svar, ja fant ut at det var browsern som ikke outputtet det, takk for svar som hjalp meg dit, jeg hadde også bug i source som jeg fikk rettet opp i :)

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...