在PHP中的另一个单词之前,在它旁边提取单词加非字母字符

时间:2017-03-26 13:54:56

标签: php regex preg-match-all

我想使用preg_match_all()提取以下三种图书。

$input_lines = "Sed ut perspiciatis, **Book 22, 1-3, 3-4. 5.** unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, **Bk. 5, 8-14**, totam rem aperiam eaque ipsa, quae ab illo (see **BookName 16:1, 6-7, 10-13**) inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem"

一本书后面跟着一个数字,后跟逗号或冒号以及可选的许多其他数字,用逗号分隔或用短划线分隔。一段时间也用于分开书籍的各个部分。

我试着靠近了:

preg_match_all("/(\w+.*?)\w+/", $input_lines, $output_array);

1 个答案:

答案 0 :(得分:0)

代码:

$input_lines="Sed ut perspiciatis, Book 22, 1-3, 3-4. 5. unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, Bk. 5, 8-14, totam rem aperiam eaque ipsa, quae ab illo (see BookName 16:1, 6-7, 10-13) inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem";
$regex="/Bo?o?k\.?(?:Name)?[0-9 .:,-]*(?:\d|\.)/";
if(preg_match_all($regex,$input_lines,$output_array)){
    echo "<pre>";
        var_export($output_array[0]);
    echo "</pre>";
}else{
    echo "No Match";
}

输出:

array (
  0 => 'Book 22, 1-3, 3-4. 5.',
  1 => 'Bk. 5, 8-14',
  2 => 'BookName 16:1, 6-7, 10-13',
)

Regex Demo&amp; Code Demo

正则表达式细分:

Bo?o?k\.?(?:Name)?     #Matches: "Book", "Bk.", and "BookName"
[0-9 .:,-]*            #Matches: digits, space, dot, colon, comma, and dash (greedily)
(?:\d|\.)              #Concludes matching on digit or dot marking the end of string