Dize ayrıştırma yardım

7 Cevap php

Ben aşağıdaki gibi bir dizesi vardır:

$string = "
<paragraph>apples are red...</paragraph>
<paragraph>john is a boy..</paragraph>
<paragraph>this is dummy text......</paragraph>
";

Ben <paragraph></paragraph> etiketleri arasında bulunan metni contanining bir diziye bu dize bölmek istiyorum. Böyle bir şey mesela:

$string = "
<paragraph>apples are red...</paragraph>
<paragraph>john is a boy..</paragraph>
<paragraph>this is dummy text......</paragraph>
";

$paragraphs = splitParagraphs($string);
/* $paragraphs now contains:
   $paragraphs[0] = apples are red...
   $paragraphs[1] = john is a boy...
   $paragraphs[1] = this is dummy text...
*/

Herhangi bir fikir?

PS harf duyarsız olmalı, <paragraph>, <PARAGRAPH>, <Paragraph> hepsi aynı şekilde tedavi edilmelidir.

Edit: Bu XML değil, dolayısıyla ben bunu ayrıştırmak için normal bir ifade gerekir SimpleXML vb kullanamazsınız XML yapısını kıracak burada bir çok şey vardır.

7 Cevap

Bu aslında XML ise ben diğer yanıtlar ile katılıyorum. Geçerli XML, ancak XML gibi belli belirsiz görünen bir şey değildir ama eğer o zaman not bir XML ayrıştırıcı ayrıştırmak için çalışmalısınız. Bunun yerine normal bir ifade kullanabilirsiniz:

$matches = array();
preg_match_all(":<paragraph>(.*?)</paragraph>:is", $string, $matches);
$result = $matches[1];
print_r($result);

Çıktı:

Array
(
    [0] => apples are red...
    [1] => john is a boy..
    [2] => this is dummy text......
)

i s yeni hatlar metinde maç sağlar davayı duyarsız ve anlamına geldiğini unutmayın. Tüm metin içinde paragraf etiketleri göz ardı edilecek değil.

: Bu hiçbir iç içe olan basit bir yapı ise,

preg_split("#</?paragraph>#i", $string);

Boş belirteçleri görmezden için:

preg_split("#</?paragraph>#i", $string, -1, PREG_SPLIT_NO_EMPTY);

Source: http://php.net/manual/en/function.preg-split.php

Eğer really ayrıştırma XML iseniz, o zaman PHP DOM Burada bir kullanımı vardır. Yukarıda önemsiz bir örnek vaka olabilir, ancak XML ayrıştırma eğer, ben özel bir XML API kullanmak istiyorum.

Bu öfkeyle XML gibi görünüyor. Gerçekten isimli, bir SimpleXMLElement veya PHP diğer XML-parcing tesis kullanmalısınız.

$xml = new SimpleXMLElement('<root>' . $paragraphs . '</root>');

foreach($xml->paragraph as $paragraph)
{
    // do stuff to $paragraph; it's strval is the contents of the paragraph
}

Peki, SimpleXML veya XMLReader gibi, bir XML ayrıştırıcı kullanmak gerekir.

Eğer fazla bir şey kesmek istiyorsanız Ancak, şu çalışacaktır:

$string = str_replace("<paragraph>", "", $string);
$string = str_replace("</paragraph>", "", $string);
$paragraphs = explode("\n", $string);

Bu sürece hat başına bir öğe olarak çalışacaktır. Eğer tek bir satırda her şeyi varsa, ile, yukarıdaki kod ikinci satırı değiştirin:

$string = str_replace("</paragraph>", "\n", $string);

İyi şanslar!

Yani XML formatında kırmaya gidiyor paragraflarda bazı şeyler var olduğunu varsayarak, ya da sadece sıradanifade ayrıştırma hakkında biraz daha fazla bilgi edinmek için arıyorsanız, bu gönderdiniz örneğin işi almalısınız. Ayrıştırması kolaylaştırır resmi bir sözdizimi var, çünkü özellikle sağlam değil, ama insanlar XML kullanmak ister bu yüzden. Neyse, ya da daha kolay. Özellikle bu çözüm bir paragraf etiketi ile başlayan ve bir paragraf yakın etiketi ile biten çözümlenen ediliyor dize bağlıdır ve aynı zamanda orada paragrafların her çifti arasında boşluklarla ama hiçbir şey olmak. Bu yüzden örnek problem için bir çok edebi bir çözümdür. Bu özel veri formatı için mevcut tek şartname belge olduğu ama sonra bunu yapabilirim iyi oldu :)

$string = " <paragraph>apples are red...</paragraph> <paragraph>john is a boy..</paragraph> <paragraph>this is dummy text......</paragraph> ";
$paragraphs = preg_replace('/(^\s*<paragraph>|<\/paragraph>\s*$)/', '', preg_split('/(?<=<\/paragraph>)\s*(?=<paragraph>)/', $string));

Burada neler oluyor, her paragrafın başlangıcını ve sonunu bulmak için preg_split işlev çağrısı, sıfır genişlik etrafa iddialar olarak kullanarak, ve sonra her parçanın başında ve sonunda gelen etiketleri dışarı kırpmak için preg_replace aradığınız olmasıdır. Sen $paragraphs olmanın içeriği ile sona

array (
  0 => 'apples are red...',
  1 => 'john is a boy..',
  2 => 'this is dummy text......',
)

Düzenlemelerinizden (harf duyarsız ve işlemek için XML ayrıştırıcı için çok büyük etiketleri) sonra, aşağıdaki çalışması gerekir:

$paragraphs = array();
$exploded = explode("</", $string);
unset($exploded[count($exploded) - 1]); //remove the useless, final "paragraph>" item
$exploded[0] = str_replace("<paragraph>", "", $exploded[0]); // first item is a special case
foreach($exploded as $item)
{
    array_push($paragraphs, str_replace("paragraph>\n<paragraph>", "", $item));
}