[php] - regular expression tekst-> url

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 08:53
Situatie
Ik heb lange teksten (jurisprudentie) in platte tekst met verwijzingen naar elkaar. Ik wil de verwijzingen klikbaar maken. De verwijzen hebben het volgende format:
  • C of T
  • -
  • 1 - 3 cijfers
  • /
  • 2 cijfers
Om een gegeven nummer te ontleden (en ombouwen naar een ander nummer) heb ik eerder de volgende preg match gemaakt (waar ik zelf al best trots op was :+ )

PHP:
1
preg_match('#^(.)-(\d{1,2,3})/(\d{2})$#', $case_number, $case_number_info);


De volgende stap..

Ik wilde de volgende code gebruiken om de nummers in de tekst om te bouwen naar links (link.php?nummer=$nummer)

http://php.net/manual/en/function.preg-match-all.php#92312

Ik heb toen de volgende code gerpobeerd
PHP:
1
$urltekst = reg_smart_replace('#^(.)-(\d{2,3})/(\d{2})$#', '<a href="link.php?nummer=$$$">$$$</a>', $tekst);


Deze werkte niet, dat komt wellicht omdat de match zoekt naar de verschillende onderdelen. De volgende code - waarbij ik de expressie heb proberen om te bouwen tot één set - doet echter ook niets
PHP:
1
$urltekst = reg_smart_replace('#^(.-\d{1,2,3}/\d{2})$#', '<a href="link.php?nummer=$$$">$$$</a>', $tekst);


Wie ziet de fout in mijn regular expression?
Als er een makkelijkere manier is, dan hoor ik dat natuurlijk ook graag :-).

Edit@NMe

De reg_smart_replace functie (waar ik ook de link naartoe opgenomen had)
Using preg_match_all I made a pretty handy function.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function reg_smart_replace($pattern, $replacement, $subject, $replacementChar = "$$$", $limit = -1) 
{ 
    if (! $pattern || ! $subject || ! $replacement ) { return false; } 
    
    $replacementChar = preg_quote($replacementChar); 
    
    preg_match_all ( $pattern, $subject, $matches); 
    
    if ($limit > -1) { 
        foreach ($matches as $count => $value ) 
        { 
            if ($count + 1 > $limit ) { unset($matches[$count]); } 
        } 
    } 
    foreach ($matches[0] as $match) { 
        $rep = ereg_replace($replacementChar, $match, $replacement); 
        $subject = ereg_replace($match, $rep, $subject); 
    } 
    
    return $subject; 
}


This function can turn blocks of text into clickable links or whatever. Example:

PHP:
1
reg_smart_replace(EMAIL_REGEX, '<a href="mailto:$$$">$$$</a>', $description)

will turn all email addresses into actual links.

Just substitute $$$ with the text that will be found by the regex. If you can't use $$$ then use the 4th parameter $replacementChar

[ Voor 31% gewijzigd door pietje63 op 13-04-2016 12:09 ]

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!

Beste antwoord (via pietje63 op 13-04-2016 13:47)


  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Check je error log, die staat vol met "ereg" errors/warnings/notices. (ereg* != preg*)

Verder:
PHP:
1
$urltekst = preg_replace('#([CT]-\\d{1,3})/(\\d{2})#', '<a id="$1-$2" href="#$1-$2">$0</a>', $tekst);

[ Voor 4% gewijzigd door DJMaze op 13-04-2016 12:55 ]

Maak je niet druk, dat doet de compressor maar

Alle reacties


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Nou moeten we raden wat die reg_smart_replace doet? :P Als die parameters gelijk moeten zijn aan die van preg_replace kloppen die $$$ in elk geval niet. Moet je niet "gewoon" $0 hebben?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Check je error log, die staat vol met "ereg" errors/warnings/notices. (ereg* != preg*)

Verder:
PHP:
1
$urltekst = preg_replace('#([CT]-\\d{1,3})/(\\d{2})#', '<a id="$1-$2" href="#$1-$2">$0</a>', $tekst);

[ Voor 4% gewijzigd door DJMaze op 13-04-2016 12:55 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 08:53
Thanks, DJMaze, werkt perfect!

Mijn error log geeft overgens geen errors (zelfs geen warnings) op de oude code. Ben bang dat ik toch maar een keer moet gaan verdiepen in regular expression en alles eromheen..

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • +1 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Die extra backslash is niet per se nodig. Het is wel netter hoor, daar niet van, maar in strings met enkele quotes hoef je alleen single quotes en backspaces zelf te escapen. De verbetering zit in die $1 en $2. ;)

Ah, ik zie dat die functie nu in de startpost staat. PCRE en POSIX mixen is inderdaad niet handig. :P

[ Voor 20% gewijzigd door NMe op 13-04-2016 14:35 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
NMe schreef op woensdag 13 april 2016 @ 14:29:
Die extra backslash is niet per se nodig
Zelfs niet in een string met dubbele aanhalingstekens.
Er is wel een WTF tussen "\n", "\\n", '\n' en '\\n' als je het niet begrijpt.
En in regex met Windows paden of php namespaces: '/\\\\namespace/'
Genoeg wtf momentjes :)

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

\n heeft geen betekenis in een string tussen enkele quotes, dat wordt gewoon als \n afgedrukt. Tussen dubbele quotes wordt het geparset en wordt er een newline van gemaakt. In dubbele quotes gaat het met \d verder inderdaad ook goed omdat \d geen control character is. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
In regex is \n wel een control character, wil je die matchen zonder control is het dus: "\\\\n"
Vandaar dat ik altijd netjes \\ gebruik (ook al hoeft het niet) om verwarring te voorkomen :)

P.S. leuke om het aantal single quotes te tellen in een sql
PHP:
1
$total_squotes -= preg_match_all('/(?<!\\\\)(\\\\\\\\)*\\\\\'/', $query, $dummy);

[ Voor 31% gewijzigd door DJMaze op 13-04-2016 15:12 ]

Maak je niet druk, dat doet de compressor maar

Pagina: 1