[PHP] preg_replace kom er niet uit

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 02:04

aex351

I am the one

Topicstarter
Ik heb wat problemen met preg_replace waar ik niet uitkom. .
Onderstaande functie pakt de output van de buffer en zoekt naar alle href's die het dan moet gaan converteren naar "zoekmachine vriendelijke urls" . Het zoeken naar de href's is regexp is geen probleem, het veranderen van waardes daarintegen weer wel.

Bij array positie 2 begint het probleem. Regexp moet zoeken naar alle = (is) in de href en dat converteren naar / (slash) . Heb tientallen manieren in regexp geprobeerd maar kom er niet uit. Voor het gemak heb ik de regexp hieronder totaal gestript. Het veranderd nu alle = (is) in compleet broncode.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public function convertHref ( $value ) { 
        $arr = array(
            '%href="(.*)[!?](.*)"%',
            '%=%',
        );
        
        $replace = array(
            'href="\2"',
            '/"',
        );
        /*
        $value is : (directe input in output broncode)
         <a href="index?var=inhoud&var2=inhoud2&var3=inhoud3">Dit moet geconverteerd worden</a>
         <a href="?var=inhoud&var2=inhoud2">Dit moet geconverteerd worden</a>
        */
        $value = preg_replace($arr,$replace,$value);
        return $value ;
    }

< dit stukje webruimte is te huur >


Acties:
  • 0 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
Hier stond wat doms, zo laat op de avond... :( :O

Nah ik zal sportief zijn: Ik schreef:
Waarom doe je dat niet gewoon met str_replace? Die is voor dit soort simpele dingen toch veel efficienter?
Maar dat geintje gaat natuurlijk niet op, omdat je alles voor de ? ongemoeit wilt laten, natuurlijk. B)

[ Voor 50% gewijzigd door Room42 op 02-04-2006 06:27 ]

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • 0 Henk 'm!

  • brokenp
  • Registratie: December 2001
  • Laatst online: 16:45
gebruik de functie parseURL, http://www.php.net/function.parse-url, en dan een str replace, en dan alles omzetten uit het query deel met str_replace

Of zie ik iets over het hoofd?

Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

Zoiets:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$input = "<a href='http://bladiebla.com?a=b&dom=blaat' style=\"bla\">bla</a>";
echo convertHref($input); /* => <a href='http://bladiebla.com/b/blaat' style="bla">bla</a> */

function convertHref ($input) { 
  $arr = array(
    "/href=([\"|'])(.*)[!?](.*)([\"|'])/Usi",
    "/[\/|&][a-z][a-z0-9]*=([a-z0-9]*)/Usi"[s][/s]
  );        
    
  $replace = array(
    "href=$1$2/$3$4",
    "$3/"
  );

  return preg_replace($arr,$replace,$input);
}
:?

[ Voor 3% gewijzigd door JHS op 02-04-2006 10:52 ]

DM!


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
{1,1} is toch gewoon hetzelfde als helemaal geen multipliciteit opgeven?

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

Hm, ja, je hebt gelijk O-) . Het is vroeg, zullen we maar zeggen :P . Zie edit.

DM!


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Ik zou dit zeker niet in 1 regexp willen oplossen, maar eigenlijk in 3 stappen. Eerst anchor-tags selecteren, daarna daaruit de href-attributen selecteren, en dan pas iets met het href attribuut doen. Je krijgt dan zoiets:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$value='    <a href="index?var=inhoud&var2=inhoud2&var3=inhoud3">Dit moet geconverteerd worden</a>
        <a href="?var=inhoud&var2=inhoud2">Dit moet geconverteerd worden</a>';

$value = preg_replace_callback('~<a(\s([^</>]*|\'[^\']*\'|\"[^\"]*\")*)?[</>]~', 'parse_anchor', $value);

echo htmlspecialchars($value);

function parse_anchor($matches)
{
    return preg_replace_callback('~(\shref\s*=\s*)(\'[^\']*\'|\"[^\"]*\"|[^\s</>]*)~', 'parse_href', $matches[0]);
}

function parse_href($matches)
{
    // doe iets met $matches[2];
    return $matches[1] . $matches[2];
}

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 02:04

aex351

I am the one

Topicstarter
Ik heb het uiteindelijk op een andere manier opgelost. Alles via 1 regexp was niet te doen. Het is nu een combinatie geworden van preg_match_all str_replace en preg_replace.

Code is nog aan optimalisatie toe maar voor als iemand het zelfde probleem heeft, hieronder vind je de gestripte versie.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public function convertHref ( $value ) 
    { 
        $OUTPUT = $value ;
        preg_match_all ('/href="(.*)"/', $value, $value);
        $x = 0 ;
        $arr = array ();
        $value2 = array();
        while ( !empty ($value[1][$x] ) ) {
            $arr[$x] = '%'. str_replace('?','\?', $value[1][$x] ).'%' ;
            $value2[$x] = str_replace('&','/', $value[1][$x] );
            $value2[$x] = str_replace('/',$this->_separator, $value2[$x] );
            $x++;   
        }
        $value = preg_replace ($arr, $value2, $OUTPUT);
        return $value ;
    }

< dit stukje webruimte is te huur >


Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 16-09 16:02

JHS

Splitting the thaum.

Ik zou van /href="(.*)"/ wel even /href="(.*)"/U maken, aangezien je anders lijkt me een probleem hebt als er twee a elementen in de $value staan :) . Maar wat vond je onelegant aan mijn i.c.m. / of crisp's oplossing?

DM!


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Een greedy match lijkt me hier niet verstandig ;)
Verder vind ik je oplossing echt verre van ideaal. Wie zegt dat je matches echt allemaal href-attributen van anchors zijn? En dat er ook overal netjes dubbele quotes zijn gebruikt?

En what about:
HTML:
1
<area nohref="nohref">

[ Voor 22% gewijzigd door crisp op 02-04-2006 18:02 ]

Intentionally left blank

Pagina: 1