1

我正在解析 wikipedia API 和 API 响应,格式如下:

Lorem ipsum dolor sit amet, consectetur adipisicing [[elitaaa|elit]], sed do eiu
smod tempor incididunt ut labore et. Ut [[enim (enimaaddasd)|enima]] ad 
minim veniam, [[some realllllly long word|quis]]  [[ullamco|test]] laboris 
iquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit 
in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

我的目标是用“word”替换每个“[[long|word]]”。例如第一行应该是这样的:

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiu

我不关心“long”的内容(它可能包含所有字符,空格和()),我只需要将括号中的内容替换为“word”。

我做了以下正则表达式:

$data = preg_replace(
            '/\[\[([\s\S])\|(.*?)\]\]/',
       '$2', $data);

但有时它会匹配整个段落,例如它替换

adipisicing [[elitaaa|elit]], sed do eiu smod tempor incididunt ut labore et.
Ut [[enim (enimaaddasd)|enima]] ad

with adipisicing enima ad.. 我试着在{1,20}后面加上[\s\S],但没有效果,因为“long”中的内容可以是一个完整的句子,也可以是单个5个字符的单词。

4

3 回答 3

1

这应该适合你。

<?php
$str = <<<STR
Lorem ipsum dolor sit amet, consectetur adipisicing [[elitaaa|elit]], sed do eiu
smod tempor incididunt ut labore et. Ut [[enim (enimaaddasd)|enima]] ad 
minim veniam, [[some realllllly long word|quis]]  [[ullamco|test]] laboris 
iquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit 
in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
STR;

$res = preg_replace('/\[+[^\]]+\|([^\]]+)\]+/', '$1', $str);
echo $res;
?>

正则表达式:

\[+         match '[' (1 or more times)
  [^\]]+    any character except: '\]' (1 or more times)
  \|        match literal '|'
  (         group and capture to \1:
   [^\]]+   any character except: '\]' (1 or more times)
  )         end of \1
   \]+      match ']' (1 or more times)

输出:

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiu
smod tempor incididunt ut labore et. Ut enima ad 
minim veniam, quis  test laboris 
iquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit 
in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
于 2013-09-09T03:44:20.910 回答
1

试试这个正则表达式:

$result = preg_replace('/\[\[[^\]]+\|([^\]]+)\]\]/', '$1', $string);
于 2013-09-09T03:10:34.573 回答
0

我很无聊,所以我举了一个程序示例。如果不适合您,那么找到此页面的其他人可能会感兴趣。

不能保证它没有错误(但它适用于示例字符串),我也想处理未关闭/打开的标签,但我必须运行。

$s = 'First, we begin with a [[single]] word. Next, we use an [[pseudonym|alias]]. ';
$s.= "And then a [[tag with\na newline]] in it. That [[is]] it!";

function wiki_parse($input) {
    $output = '';
    $offset = 0;
    while (true) {
        $open  = mb_strpos($input, '[[', $offset);
        $close = mb_strpos($input, ']]', $offset);
        if ($open === false or $close === false)
            break;
        if ($open > $offset)
            $output .= mb_substr($input, $offset, $open-$offset);
        $output .= wiki_parse_token($input, $open, $close);
        $offset = $close+2;
    }
    if ($offset < mb_strlen($input))
        $output .= mb_substr($input, $offset);
    return $output;
}

function wiki_parse_token($input, $open, $close) {
    $token = mb_substr($input, $open+2, ($close-$open)-2);
    if (mb_strpos($token, "\n") !== false) {
        $token = "[[$token]]";
    } else {
        $sep = mb_strpos($token, '|');
        if ($sep !== false) {
            $token = mb_substr($token, $sep+1);
        }
    }
    return $token;
}

var_dump($s);
var_dump(wiki_parse($s));
die;
于 2013-09-09T05:12:44.677 回答