2016-05-04 5 views
1

Как Переберите $ строки текста, чтобы получить все экземпляры в данный момент мой код только помещает первую строку: фрукты имя яблока каменьPHP Регулирующие зиЬзЬг

Как я могу сделать это также проверить вторую строку и вывод: фрукты имя гуавы Родди

, например, в тексте $ строки ниже мы имеем:
Foo имя стоунер и имя Foo Родди на данный момент я могу только извлечь имя стоунер и скрипт останавливается. Мне также хотелось бы извлечь имя roddy.

извините, если я не понимаю смысла. мой английский не так хорош

$string = 'foo name stoner loller bar php haystack needle fruit apples 
foo name roddy koala bar php haystack needle fruit guavas'; 
$needle = 'fruit'; 
$needle1 = 'name'; 
$str = substr($string, strpos($string, $needle) + strlen($needle), 6); 
$str1 = substr($string, strpos($string, $needle1) + strlen($needle1), 6); 
echo $needle. $str; 
echo " "; 
echo $needle1. $str1; 
+1

Какой желаемый выход? Трудно понять ваше требование. –

+0

Используйте preg_split, и вы можете разбить любой символ пробела, а не просто пробельные символы –

+0

Или использовать str_word_count() для разбиения строки на массив слов –

ответ

0

Посмотрите на это регулярное выражение, это то, что вы хотите?

$string = 'foo name stoner loller bar php haystack needle fruit apples 
foo name roddy koala bar php haystack needle fruit guavas'; 
preg_match("/(name \w{6}).*(fruit \w{6})/", $string, $output); 

выход:

array(3 
    0 => name stoner loller bar php haystack needle fruit apples 
    1 => name stoner 
    2 => fruit apples 
) 
array(3 
    0 => name roddy koala bar php haystack needle fruit guavas 
    1 => name roddy 
    2 => fruit guavas 
) 

http://www.phpliveregex.com/p/fzF

Отредактировано только матч 6 символов, но это означает, что строка "Роди" не соответствует, как это только 5 символов.

0

ОБНОВЛЕНИЕ: После последних комментариев, которые вы добавили к своему вопросу, я немного смущен, и я думаю, что я не понял ваш вопрос правильно, поэтому этот ответ может быть не совсем таким, каким вы хотите. .


Я предполагаю, что вы хотите разделить строку по строкам и отфильтровать те строки, которые содержат строку. Проверьте это:

<?php 

// No HTML output for now, so I added this to make it display properly in the browser 
// You can remove this line if you are using `php -f` from the command line instead of a browser 
header("Content-Type: text/plain"); 

// Added two more lines for clarification 
$string = 'foo name stoner loller bar php haystack needle fruit apples 
foo name roddy koala bar php haystack needle fruit guavas 
something here which only contains fruit bla bla test 
and this line has name but thats it bla bla bla'; 

// I guess you will have more needles later, so an array makes sense here 
$needles = ['fruit', 'name', 'nothing']; 

// Split the string into lines first 
$lines = explode("\n", $string); 

// Check each needle 
foreach($needles as $needle) { 
    // Output needle 
    echo "Needle: $needle\n"; 

    // Filter the lines: Check if word is contained 
    $matchingLines = array_filter($lines, function($line) use ($needle) { 
     // Tells array_filter to include the line if the needle is contained in it 
     return strpos($line, $needle) !== false; 

     // Note that this currently searches the full line regardless of word 
     // boundaries. If you wanted to find full words only (e.g. not `dragonfruit` 
     // when searching for `fruit` or something), you could use this: 
     // return in_array($needle, explode(" ", $line)); 
    }); 

    // Output results, if any 
    if(count($matchingLines)) { 
     echo "Results:\n"; 
     echo implode("\n", $matchingLines); 
    } else { 
     echo "No results!"; 
    } 
    echo "\n\n"; 
} 

Выход:

Needle: fruit 
Results: 
foo name stoner loller bar php haystack needle fruit apples 
foo name roddy koala bar php haystack needle fruit guavas 
something here which only contains fruit bla bla test 

Needle: name 
Results: 
foo name stoner loller bar php haystack needle fruit apples 
foo name roddy koala bar php haystack needle fruit guavas 
and this line has name but thats it bla bla bla 

Needle: nothing 
No results! 
+0

wow отличный пример, у вас есть очень быстрые навыки кодирования, но я хочу, чтобы выложил всего 6 символов после каждой иглы $ str = substr ($ string, strpos ($ string, $ needle) + strlen ($ needle), 6); – user3548161

+0

Так всегда 6 символов, независимо от того, что это за слово? Даже если это бананы? – Andreas

+0

Ну, тогда это намного проще: вы можете продолжать использовать свой код, но вам просто нужно поместить его в цикл и начать поиск после позиции последнего совпадения, пока вы не найдете больше совпадения, т. Е. Используйте 'substr' на вашем стоге сена сначала, чтобы вырезать часть, которую вы уже искали. – CherryDT

0

Так что, если на основе комментариев foo является строка разделитель и строка, по существу, следует рассматривать в качестве ассоциированного массива ключ => значения

<?php 
    $string = 'foo name stoner loller bar php haystack needle fruit apples foo name roddy koala bar php haystack needle fruit guavas'; 

    //Get all of the arrays we will need to search 
    $hayStacks = explode("foo", $string); 

    foreach($hayStacks as $hayStack){ 
     $words = explode(' ', $hayStack); 
     //Enter the key you want to find and then get the next element value. 
     echo $words[array_search("name", $words)+1]."<br>"; 
     echo $words[array_search("fruit", $words)+1]."<br>"; 
    } 
?> 
+0

Это не дает желаемого результата, потому что OP хочет извлечь подстроку длиной 6 после сопоставления ключевого слова.Это не ясно выражено в вопросе - это было позже в комментариях. – mickmackusa