2013-07-11 5 views
0

В PHP, учитывая длинный кусок текста, например:Извлечение цитат из строки

Г-жа Кейн, который был избран Генеральный прокурор в прошлом году и был упоминается в качестве возможного будущего кандидата на пост губернатора , ударил политическую ноту в своем кратком заявлении аудитории, которая приветствовала и аплодировала ее решению.

«Я посмотрел на него таким образом, губернатор будет O.K.», - сказала она. Она интересуется, добавила она, кто будет представлять «в DAVES и Robbies, который представляет Emilys и Amys?»

«Как генеральный прокурор,» сказала она, «Я выбираю тебя.»

Я хотел бы, чтобы извлечь все цитируемый материал, в данном случае массив с этими результатами:

"I looked at it this way, the governor’s going to be O.K.," 
"the Daves and Robbies, who represents the Emilys and Amys?" 
"As attorney general," 
"I choose you." 

Предположение:

  • Там всегда будет отверстие соответствия & закрывающей кавычки
  • Простые и двойные кавычки

Бонусные баллы, если вы убедитесь, что он обрабатывает фигурные кавычки, одиночные кавычки и другие специальные случаи, но не стесняйтесь переходите к предположению о простых двойных кавычках, если это упростит.

И да - я искал сайт для ответов, и, хотя было что-то полезное, я не ударил ничего, что сработало. Ближайшим было это, но без кубиков:

preg_match_all('/"([^"]*(?:\\"[^"]*)*)"/', $content, $matches) 
+0

, что вы пробовали ? http://mattgemmell.com/2008/12/08/what-have-you-tried/ – FlavorScape

+0

Очень полезно. Да, я пробовал различные выражения регулярных выражений, такие как это, но безрезультатно: preg_match_all ('/ "([^"] * (?: \\ "[^"] *) *) "/', $ content, $ matches) – donohoe

+0

Я бы быстро и грязно взорвался, а затем извлек четные элементы из массива: P – Orestes

ответ

1
$string = 'Ms. Kane, who was elected attorney general last year and has been mentioned as a possible future candidate for governor, struck a political note in her brief announcement to an audience that cheered and applauded her decision. 

“I looked at it this way, the governor’s going to be O.K.,” she said. She wondered, she added, who would represent “the Daves and Robbies, who represents the Emilys and Amys?” 

“As attorney general,” she said, “I choose you.”'; 

// Normalize quotes 
$search = array("\xe2\x80\x9c", "\xe2\x80\x9d", "\xe2\x80\x98", "\xe2\x80\x99"); 
$replace = array('"', '"', "'", "'"); 
$newstring = str_replace($search, $replace, $string); 

// Extract text 
$regex = "/\"(.*)\"/U"; 
preg_match_all ($regex, $newstring, $output); 

if(isset($output[1])) { 
    print_r($output[1]); 
} else { 
    echo $newstring; 
} 

должны дать

Array 
(
    [0] => I looked at it this way, the governor's going to be O.K., 
    [1] => the Daves and Robbies, who represents the Emilys and Amys? 
    [2] => As attorney general, 
    [3] => I choose you. 
) 
+0

Спасибо - это сработало очень хорошо и предоставил мне средства для его расширения, чтобы охватить еще несколько неожиданных потребностей – donohoe

1

Можете попробовать PHP split string..

Псевдокод:

Разделить все в массив с "в качестве параметра разделенным, а затем использовать% (модуль 2), чтобы выбрать только„в-между“текстом в массиве строк, чтобы поймать Curlies и т.д., просто. преобразовать все экземпляры в прямые кавычки в первую очередь.

+0

Это отличный подход - не думал об этом. Его можно попробовать в другом проекте – donohoe

1

Вы можете использовать это ....

$matches = array(); 
preg_match_all('/(\“.*\”)/U', str_replace("\n", " ", $str), $matches); 
print_r($matches); 

примечание. Я удаляю новые строки, поэтому он будет давать совпадения, где цитата начинается с одной строки и заканчивается на другой.

1

Простейший способ, но лучше всего не найти появление «с strstr() и после использования substr() вырезать строку.

$string = 'Your long text "with quotation"'; 

$occur = strpos($string, '"'); // the frst occurence of " 
$occur2 = strpos($string, '"', $occur + 1); // second occurence of " 

$start = $occur; // the start for cut text 
$lenght = $occur2 - $occur + 1; // lenght of all quoted text for cut 

$res = substr($string, $start, $lenght); // Your quoted text here ex: "with quotation" 

И вы можете вставить это в петлю более одного цитируемого текста:

$string = 'Your long text "with quotation" Another long text "and text with quotation"'; 

    $occur2 = 0; // for doing the first search from begin 
    $resString = ''; // if you wont string and not array 
    $res = array(); 
    $end = strripos($string, '"'); // find the last occurence for exit loop 

    while(true){ 
     $occur = strpos($string, '"', $occur2); // after $occur2 change his value for find next occur 
     $occur2 = strpos($string, '"', $occur + 1); 

     $start = $occur; 
     $lenght = $occur2 - $occur + 1; 

     $res[] = substr($string, $start, $lenght); // $res may be array 
     $resString .= substr($string, $start, $lenght); // or string with concat 

     if($end == $occur2) 
      break; // brak if is the last occurence 

     $occur2++; // increment for search next 
    } 


    echo $resString .'<br>'; 
    exit(print_r($res)); 

Результат:

"with quotation""and text with quotation" 
or 
Array ([0] => "with quotation" [1] => "and text with quotation") 

Его простой способ без использования регулярных выражений, надежда помочь кому-то :) (извините за плохой английский)

1

Вы можете сделать это следующим образом:

<meta charset="UTF-8" /> 
<pre> 
<?php 
$pattern = '~(?|"((?>[^"]++|(?<=\\")")*)"|“((?>[^”]++|(?<=\\”)”)*)”)~u'; 

$text = <<<LOD 
Ms. Kane, who was elected attorney general last year and has been mentioned as a possible future candidate for governor, struck a political note in her brief announcement to an audience that cheered and applauded her decision. 

“I looked at it this way, the governor’s going to be O.K.,” she said. She wondered, she added, who would represent “the Daves and Robbies, who represents the Emilys and Amys?” 

“As attorney general,” she said, “I choose you.” 
LOD; 

preg_match_all ($pattern, $text, $matches); 
print_r($matches[1]); 

Поскольку вы используете символы юникода, вы должны добавить модификатор u в конце шаблона.

Вы можете легко добавить, что вы хотите, чтобы шаблон таким же образом, пример с простыми кавычками:

$pattern = '~(?|"((?>[^"]++|(?<=\\")")*)"|“((?>[^”]++|(?<=\\”)”)*)”|\'((?>[^\']++|(?<=\\\')\')*)\')~u'; 

Обратите внимание, что структура всегда одинакова:

(?| 
    "((?>[^"]++|(?<=\\")")*)" 
    | 
    “((?>[^”]++|(?<=\\”)”)*)” 
    | 
    \'((?>[^\']++|(?<=\\\')\')*)\' 
) 
Смежные вопросы