[RegEx] Wikipedia-URL's maken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Spinal
  • Registratie: Februari 2001
  • Laatst online: 22-09 12:06
Hallo,
ik ben nou al een paar uur bezig met het maken van een regex die Wikipedia-links maakt. Bijvoorbeeld [[Tweakers.net]] moet een link worden naar http://en.wikipedia.org/wiki/Tweakers.net
Dat werkt prima:
PHP:
1
$tekst = preg_replace("#\[\[(.+?)\|(.+?)\]\]#is","<a href=\"http://en.wikipedia.org/wiki/\\1\">\\2</a>",$tekst);

[[Tweakers.net|Tweakers]] moet dezelfde link geven. Ook dat werkt prima:
PHP:
1
$tekst = preg_replace("#\[\[(.+?)\|(.+?)\]\]#is","<a href=\"http://en.wikipedia.org/wiki/\\1\">\\2</a>",$tekst);


Nou wil ik ook meerdere links in 1 regel vervangen. Als dit in de vorm [[foo]] [[bar]] of [[foo|bar]] [[foo2]] is wil dat prima, maar bij [[foo]] [[foo2|bar]] gaat mijn regex de mist in.
Ik dacht eerst dat het een kwestie was van lazy/greedy omwisselen. Nee dus, dus toen ben ik verder dingen gaan proberen waarvan ik dacht dat het zou helpen: i.p.v. (.+?) heb ik ([\w^|]+?) geprobeerd, maar dan pakt hij alle links met een | helemaal niet meer.

Zie ik iets over het hoofd? Kan ik dit misschien beter anders oplossen?
Wie kan mij verder helpen? :)

Full-stack webdeveloper in Groningen


Acties:
  • 0 Henk 'm!

  • Blaise
  • Registratie: Juni 2001
  • Niet online
Waarom kijk je niet in de mediawiki (wikipedia) sourcecode?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Context links: [[|name]] and [[name (context)|]]
#
global $wgLegalTitleChars;
$tc = "[$wgLegalTitleChars]";
$nc = '[ _0-9A-Za-z\x80-\xff]'; # Namespaces can use non-ascii!

$p1 = "/\[\[(:?$nc+:|:|)($tc+?)( \\($tc+\\))\\|]]/";        # [[ns:page (context)|]]
$p3 = "/\[\[(:?$nc+:|:|)($tc+?)( \\($tc+\\)|)(, $tc+|)\\|]]/";  # [[ns:page (context), context|]]
$p2 = "/\[\[\\|($tc+)]]/";                  # [[|page]]

# try $p1 first, to turn "[[A, B (C)|]]" into "[[A, B (C)|A, B]]"
$text = preg_replace( $p1, '[[\\1\\2\\3|\\2]]', $text );
$text = preg_replace( $p3, '[[\\1\\2\\3\\4|\\2]]', $text );

$t = $this->mTitle->getText();
$m = array();
if ( preg_match( "/^($nc+:|)$tc+?( \\($tc+\\))$/", $t, $m ) ) {
    $text = preg_replace( $p2, "[[$m[1]\\1$m[2]|\\1]]", $text );
} elseif ( preg_match( "/^($nc+:|)$tc+?(, $tc+|)$/", $t, $m ) && '' != "$m[1]$m[2]" ) {
    $text = preg_replace( $p2, "[[$m[1]\\1$m[2]|\\1]]", $text );
} else {
    # if there's no context, don't bother duplicating the title
    $text = preg_replace( $p2, '[[\\1]]', $text );
}

Mediawiki 1.9.4, mediawiki\includes\Parser.php, regel 3700 - 3723. (of doet dat iets anders?)

Acties:
  • 0 Henk 'm!

  • Spinal
  • Registratie: Februari 2001
  • Laatst online: 22-09 12:06
Ik had Mediawiki er al bijgepakt (1.11.0), maar heb blijkbaar niet verder gekeken dan "Process [[ ]] wikilinks" (regel 1551 e.v.)
Ik zal dat stuk eens bekijken, al doet het denk ik niet helemaal wat ik zoek...

Full-stack webdeveloper in Groningen