Nasıl bir düzenli ifade ile bir sınırlayıcı ikinci geçtiği kadar bir dize her şeyi aynı olabilir?

6 Cevap php

Daha sonra bir süre boşluk ikinci bir örneğini bularak bir preg_match_all rafine çalışıyorum:

<?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; }
?>

Ama bu işe yaramazsa: {2} olay yanlıştır.

Dinamik HTML kazıma çünkü ben preg_match_all kullanmak zorunda.

Ben dizeden bu yakalamak istiyoruz:

East Winds 20 knots. Gusts to 25 knots.

6 Cevap

Burada farklı bir yaklaşım

$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.

Neden sadece o boşluk bütün dönemlerini almak ve sadece bazı sonuçları kullanmak değil mi?

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

Seni ancak bu gelen yakalamak istediğinizi tam olarak emin değilim. Sveyaunuzu biraz muğlak.

Şimdi denemek için (bir boşluk ve ardından) ikinci dönemi de dahil olmak üzere her şeyi yakalamak isterseniz:

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

Bu açgözlü olmayan joker maçı kullanır ve DOTALL böylece . satırsonlarını eşleşir.

Eğer son alanı yakalamak için istemiyveyasanız, siz de yapabilirsiniz:

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

Ayrıca da, yani dize fesih saymak için izin isteyebilirsiniz:

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

veya

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

Lastly, since you're after one match and want the first one, you could just as easily use preg_match() rather than preg_match_all() fveya this.

Ben sanmıyorum (. \ S {2}) Sence anlamı ne demektir. Haliyle, bu maç olacak. "" (Iki boşluk ve ardından bir dönem), değil ikinci vuku "."

Sen deneyebilirsiniz:

<?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);
?>

Çıktı:

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

Eğer sadece tek bir oluşumu yakalamak istiyorsanız Ayrıca, neden kullanıyorsunuz preg_match_all? preg_match yeterli olacaktır.

Hiçbir regex gerekir. Basit düşünüyorum

$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);

Ben dizeden bu yakalamak istiyorum: Doğu 20 knot Winds. 25 knot Rüzgarlar.

Ben iki önerim var:

1) Sadece "." De dize Patlat (çift boşluk) ve sadece sonucu yazdırmak.

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

2) Kullanım Patlat ve daha fazla performans dostu preg_match_all daha strpos.

foreach( explode(".",$str) as $key=>$val) {
    echo (strpos($val,"knots")>0) ? trim($val) . ". " : "";
}
// Output: East Winds 20 knots. Gusts to 25 knots.