Как я могу сопоставить все в строке до второго вхождения разделителя с регулярным выражением? - PullRequest
3 голосов
/ 25 марта 2010

Я пытаюсь уточнить preg_match_all, найдя второе вхождение периода, затем пробел:

<?php

$str = "East Winds 20 knots. Gusts to 25 knots. Waters a moderate chop.  Slight chance of showers.";

preg_match_all ('/(^)((.|\n)+?)(\.\s{2})/',$str, $matches);

$dataarray=$matches[2];
foreach ($dataarray as $value)
{ echo $value; }
?>

Но это не работает: {2} вхождение неверно.

Я должен использовать preg_match_all, потому что я очищаю динамический HTML.

Я хочу захватить это из строки:

East Winds 20 knots. Gusts to 25 knots.

Ответы [ 6 ]

2 голосов
/ 25 марта 2010

Вот другой подход

$str = "East Winds 20 knots. Gusts to 25 knots. Waters a moderate chop.  Slight chance of showers.";


$sentences = preg_split('/\.\s/', $str);

$firstTwoSentences = $sentences[0] . '. ' . $sentences[1] . '.';


echo $firstTwoSentences; // East Winds 20 knots. Gusts to 25 knots.
1 голос
/ 25 марта 2010

Почему бы просто не получить все периоды, а затем пробел и использовать только некоторые результаты?

preg_match_all('!\. !', $str, $matches);
echo $matches[0][1]; // second match

Я не уверен, что именно вы хотите захватить из этого, однако. Ваш вопрос немного расплывчатый.

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

preg_match_all('!^((?:.*?\. ){2})!s', $str, $matches);

Используется не жадный символ подстановки, а DOTALL, поэтому . соответствует символу новой строки.

Если вы не хотите захватывать последний пробел, вы можете сделать это тоже:

preg_match_all('!^((?:.*?\.(?= )){2})!s', $str, $matches);

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

preg_match_all('!^((?:.*?\.(?: |\z)){2})!s', $str, $matches);

или

preg_match_all('!^((?:.*?\.(?= |\z)){2})!s', $str, $matches);

Наконец, так как вы после одного матча и хотите первый, вы могли бы просто использовать для этого preg_match() вместо preg_match_all().

0 голосов
/ 24 июня 2010

Я хочу захватить это из строки: восточные ветры 20 узлов. Порывы до 25 узлов.

У меня есть два предложения:

1) Просто взорвите строку в «.» (Двойной пробел) и просто напечатайте результат.

$arr = explode(".  ",$str);
echo $arr[0] . ".";
// Output: East Winds 20 knots. Gusts to 25 knots.

2) Используйте Explode и Strpos, которые более удобны для исполнения, чем Preg_match_all.

foreach( explode(".",$str) as $key=>$val) {
    echo (strpos($val,"knots")>0) ? trim($val) . ". " : "";
}
// Output: East Winds 20 knots. Gusts to 25 knots.
0 голосов
/ 25 марта 2010

не нужно регулярное выражение. думай просто

$str = "East Winds 20 knots. Gusts to 25 knots. Waters a moderate chop.  Slight chance of showers.";
$s = explode(". ",$str);
$s = implode(". ",array_slice($s,0,2)) ;
print_r($s);
0 голосов
/ 25 марта 2010

Я не думаю, что (. \ S {2}) означает то, что вы думаете, это значит. В таком виде он будет соответствовать «.» (Точка, за которой следуют два пробела), а не второму вхождению «.»

0 голосов
/ 25 марта 2010

Вы можете попробовать:

<?php
$str = "East Winds 20 knots. Gusts to 25 knots. Waters a moderate chop.  Slight chance of showers.";
if(preg_match_all ('/(.*?\. .*?\. )/',$str, $matches))
    $dataarrray = $matches[1];
var_dump($dataarrray);
?>

Выход:

array(1) {
  [0]=>
  string(40) "East Winds 20 knots. Gusts to 25 knots. "
}

Также, если вы хотите захватить только один случай, почему вы используете preg_match_all? preg_match должно хватить.

...