在PHP中解析嵌套句子

时间:2014-02-25 02:11:53

标签: php regex string-parsing

我是PHP的新手,试图从数据库中解析一行,并在其中获取一些neccesarray信息。

编辑:

我必须把作者姓名和姓氏作为第一个示例行: 预期的输出应该是:

Ayse Serap Karadag Serap Gunes Bilgili Omer Calka Sevda Onder Evren Burakgazi-Dalkilic

订单

[Karadag, Ayse Serap; Bilgili, Serap Gunes; Calka, Omer; Onder, Sevda] Yuzuncu Yil Univ, Sch Med, Dept Dermatol. %#[Burakgazi-Dalkilic, Evren] UMDNJ Cooper Univ Med Ctr, Piscataway, NJ USA.1

我从数据库中取这行。我必须采取一些作者姓名。 作者姓名用[]写成。首先是用,分隔的姓氏,如果有第二位作者则用;分隔。

我必须在循环中执行此操作,因为我有近1000行这样的行。

我的代码是:

<?php

  $con=mysqli_connect("localhost","root","","authors");
  if (mysqli_connect_errno())
{
 echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$result = mysqli_query($con,"SELECT Correspounding_Author FROM paper Limit 10 ");


while($row = mysqli_fetch_array($result))
  {
  echo "<br>";
  echo $row['Correspounding_Author'] ;
  echo "<br>";
  // do sth here
  }

mysqli_close($con);

?> 

我正在寻找像explode() substr这样的方法,但正如我在开头提到的那样,我无法处理这个嵌套句子。

感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

while循环中的代码应为:

preg_match_all("/\\[([^\\]]+)\\]/", $row['Correspounding_Author'], $matches);
foreach($matches[1] as $match){
$exp = explode(";", $match);
    foreach($exp as $val){
    print(implode(" ", array_map("trim", array_reverse(explode(",", $val))))."<br/>");
    }
}

答案 1 :(得分:1)

以下内容应该有效:

$pattern = '~(?<=\[|\G;)([^,]+),([^;\]]+)~';
if (preg_match_all($pattern, $row['Correspounding_Author'], $matches, PREG_SET_ORDER)) {
    print_r(array_map(function($match) {
        return sprintf('%s %s', ltrim($match[2]), ltrim($match[1]));
    }, $matches));
}

这是一个匹配以下项目的表达式:

  1. 首先打开方括号[或继续上一个匹配结束的位置后跟分号,
  2. 在分号或右方括号之前结束。
  3. 另请参阅:PCRE Assertions

    输出

    Array
    (
        [0] => Ayse Serap Karadag
        [1] => Serap Gunes Bilgili
        [2] => Omer Calka
        [3] => Sevda Onder
        [4] => Evren Burakgazi-Dalkilic
    )