Tek kelime içine bir metin bölünmüş

6 Cevap php

Ben PHP kullanarak tek kelime içine bir metni bölmek istiyorum. Nasıl bunu başarmak için herhangi bir fikrin var mı?

Benim yaklaşım:

function tokenizer($text) {
    $text = trim(strtolower($text));
    $punctuation = '/[^a-z0-9äöüß-]/';
    $result = preg_split($punctuation, $text, -1, PREG_SPLIT_NO_EMPTY);
    for ($i = 0; $i < count($result); $i++) {
        $result[$i] = trim($result[$i]);
    }
    return $result; // contains the single words
}
$text = 'This is an example text, it contains commas and full-stops. Exclamation marks, too! Question marks? All punctuation marks you know.';
print_r(tokenizer($text));

Bu iyi bir yaklaşım mı? Eğer iyileştirilmesi için herhangi bir fikrin var mı?

Şimdiden teşekkürler!

6 Cevap

\ S boşluk sınıfı ile birlikte herhangi bir unicode noktalama karakterle eşleşir class \ p {P}, kullanın.

$result = preg_split('/((^\p{P}+)|(\p{P}*\s+\p{P}*)|(\p{P}+$))/', $text, -1, PREG_SPLIT_NO_EMPTY);

Bu, bir veya daha fazla boşluk karakterleri bir grup bölünmüş, aynı zamanda herhangi bir çevredeki noktalama karakterleri emmek olacaktır. Ayrıca dizenin başında veya sonunda noktalama karakterleri ile eşleşir. Bu, ve "o 'ah!' Dedi" "yok" gibi durumlarda ayrımcılık

Tokenize - strtok.

<?php
$text = 'This is an example text, it contains commas and full stops. Exclamation marks, too! Question marks? All punctuation marks you know.';
$delim = ' \n\t,.!?:;';

$tok = strtok($text, $delim);

while ($tok !== false) {
    echo "Word=$tok<br />";
    $tok = strtok($delim);
}
?>

Ben bunu ilk önce bölme önce alt durumda dize olur. İşte i değiştirici ve dizi işlem sonrasında gereksiz olur. Ayrıca ben sözcük olmayan karakterler için \W steno kullanmak ve bir + çarpan eklersiniz.

$text = 'This is an example text, it contains commas and full stops. Exclamation marks, too! Question marks? All punctuation marks you know.';
$result = preg_split('/\W+/', strtolower($text), -1, PREG_SPLIT_NO_EMPTY);


Edit Unicode character properties yerine \W ve as marcog suggested kullanın. [\p{P}\p{Z}] (noktalama ve ayırıcı karakterleri) gibi bir şey \W daha spesifik karakterleri kapsayacak.

ayrıca büyük dize dize belirteçleri almak için PHP Strtok () işlevini kullanabilirsiniz. Bu gibi kullanabilirsiniz:

 $result = array();
 // your original string
 $text = 'This is an example text, it contains commas and full stops. Exclamation marks, too! Question marks? All punctuation marks you know.';
 // you pass strtok() your string, and a delimiter to specify how tokens are separated. words are seperated by a space.
 $word = strtok($text,' ');
 while ( $word !== false ) {
     $result[] = $word;
     $word = strtok(' ');
 }

strtok() için php belgelere daha fazla görmek

Yapın:

str_word_count($text, 1);

Yoksa unicode desteğine ihtiyacınız varsa:

function str_word_count_Helper($string, $format = 0, $search = null)
{
    $result = array();
    $matches = array();

    if (preg_match_all('~[\p{L}\p{Mn}\p{Pd}\'\x{2019}' . preg_quote($search, '~') . ']+~u', $string, $matches) > 0)
    {
    	$result = $matches[0];
    }

    if ($format == 0)
    {
    	return count($result);
    }

    return $result;
}

Ayrıca yöntemini patlayabilir kullanabilirsiniz: http://php.net/manual/en/function.explode.php

$words = explode(" ", $sentence);