Kısıtlayan ile küçük bir parçası haline dize bölmek [PHP RegEx HTML]

2 Cevap php

Ben şu kısıtlamayla bir diziye uzun bir dize bölmek gerekir:

  • input will be HTML string, tam sayfa ya da kısmi olabilir.
  • Each part (new strings) will have a limited number of character (örn. en fazla 8000 karakter)
  • Each part can contain multiple sentences (tarafından ayrılmış. [Nokta]) but never a partial sentences. Except if the last part of the string (son parçası olarak herhangi bir tam durdurmak olmayabilir.
  • {[(0)] olarak} (<a href='test.html'> <a href='test ile. Ve html'>). Bu HTML etiketi bozulmamış olmalıdır anlamına gelir. But starting tag and ending tag can be stay on different segment/chunk.
  • If any middle sentence is greater than the desired length, then leading and trailing tags and white spaces should be in different part of the array. Even after do so, if the sentence is longer, then divide it into multiple element of the array :(
  • Please note that: No need to parse the HTML but tags (like or etc) <.*>

Ben preg_split ile düzenli ifade bunu düşünüyorum. Uygun RegEx'in bana yardım eder misiniz. Regex dışında herhangi bir çözüm de hoş geldiniz.

Teşekkür ederim

Sadi

2 Cevap

Yanılıyorsam beni düzeltin, ama basit bir regexp ile bunu yapabileceğimi sanmıyorum. Tam sıradanifade uygulamasında böyle bir şey kullanabilirsiniz:

$parts = preg_split("/(?<!<[^>]*)\./", $input);

ama php olmayan sabit uzunlukta Geriye İlerleme izin vermez, böylece işe yaramaz. görünüşe göre sadece 2 JGsoft ve. net sıradanifade vardır emin. Useful Page

bu ile ilgili benim bir yöntem olacaktır:

function splitStringUp($input, $maxlen) {
    $parts = explode(".", $input);
    $i = 0;
    while ($i < count($parts)) {
        if (preg_match("/<[^>]*$/", $parts[$i])) {
            array_splice($parts, $i, 2, $parts[$i] . "." . $parts[$i+1]);
        } else {
            if ($i < (count($parts) - 1) && strlen($parts[$i] . "." . $parts[$i+1]) < $maxlen) {
                array_splice($parts, $i, 2, $parts[$i] . "." . $parts[$i+1]);
            } else {
                $i++;
            }
        }
    }
    return $parts;
}

Eğer tek bir cümle> 8000 karakter uzunluğunda olduğu zaman ne istediğinizi bahsetmiyorlar, yani bu sadece bozulmadan onları bırakır.

örnek çıktı:

splitStringUp("this is a sentence. this is another sentence. this is an html <a href=\"a.b.c\">tag. and the closing tag</a>. hooray", 8000);
array(1) {
  [0]=> string(114) "this is a sentence. this is another sentence. this is an html <a href="a.b.c">tag. and the closing tag</a>. hooray"
}

splitStringUp("this is a sentence. this is another sentence. this is an html <a href=\"a.b.c\">tag. and the closing tag</a>. hooray", 80);
array(2) {
  [0]=> string(81) "this is a sentence. this is another sentence. this is an html <a href="a.b.c">tag"
  [1]=> string(32) " and the closing tag</a>. hooray"
}

splitStringUp("this is a sentence. this is another sentence. this is an html <a href=\"a.b.c\">tag. and the closing tag</a>. hooray", 40);
array(4) {
  [0]=> string(18) "this is a sentence"
  [1]=> string(25) " this is another sentence"
  [2]=> string(36) " this is an html <a href="a.b.c">tag"
  [3]=> string(32) " and the closing tag</a>. hooray"
}

splitStringUp("this is a sentence. this is another sentence. this is an html <a href=\"a.b.c\">tag. and the closing tag</a>. hooray", 0);
array(5) {
  [0]=> string(18) "this is a sentence"
  [1]=> string(25) " this is another sentence"
  [2]=> string(36) " this is an html <a href="a.b.c">tag"
  [3]=> string(24) " and the closing tag</a>"
  [4]=> string(7) " hooray"
}

Ne yazık ki, html, düzensiz dilidir bir regex ile ayrıştırmak anlamına gelir. Girişi her zaman benzer, ya da sadece bazı kısımlarını ayrıştırmak gerekiyorsa Öte yandan, bu sorunlu değil. Bu regex üzerinde yineleme elemanları adı oluşturur ve onun içeriği:

'~<(?P<element>\s+)(?P<attributes>[^>]*)>(?:(?P<content>.*?)</\s+>)?~'