Dizesinde belirteçleri bulmak için açılamıyor

6 Cevap

I am trying to write a small php application and i am facing a problem. This is suppose to get text like :

Bu * isim ama * adıdır.

And should take the words that start with a star and add them to the string tokens. However this is not working.

// get list of fields (each should have words delimited by underscores
$storyArray = split(' ', $story);
$tokens = ""; // space-delimited list of fields
for ($i = 0; $i < count($storyArray); $i++) {
    if ($storyArray[$i][0] == '*')
    	$tokens .= $storyArray[$i] + " ";
}
$tokensArray = split(' ', $tokens);

6 Cevap

"+" Değil dize birleştirme, ek içindir. Her zaman kaynağında 0 olacak numaraları, olarak argümanları atmalarını.

Bir başka not, yarma $tokens gereksizdir. Bunun yerine, belirteçleri append $tokensArray:

$story = "this is *noun but it is *name";
// get list of fields (each should have words delimited by underscores
$storyArray = split(' ', $story);
$tokens = ""; // space-delimited list of fields
$tokensArray=array();
for ($i = 0; $i < count($storyArray); $i++) {
    if ($storyArray[$i][0] == '*') {  
        $tokens .= $storyArray[$i] . " ";
        $tokensArray[] = $storyArray[$i];
    }
}

Sadece $tokens üretmek için gerekirse $tokensArray, bunu kurtulabilirsiniz. Ayrıca, ihtiyaç bağlı olarak $storyArray, preg_match_all(...) kodunuzu değiştirmek mümkün olabilir:

preg_match_all('/\*\w+/', $story, $tokensArray);
$tokensArray = $tokensArray[0];

Vay be, ben bu hata ayıklama ve bariz hata, eksik oldum inanamıyorum!

Burada bu çizgi:

$tokens .= $storyArray[$i] + " ";

Bir süre ile usülü gerekirse (.), bir artı işareti değil! Ne şu anda sahip temelde $tokens .= 0; aynıdır

Bu benim için çalıştı:

$story = "this is *noun but it is *name";

$storyArray = split(' ', $story);
$tokens = array();
for ($i = 0; $i < count($storyArray); $i++) {
  if ($storyArray[$i][0] == '*') {
    array_push($tokens, substr($storyArray[$i], 1));
  }
}
var_dump($tokens);
$tokenString = implode(" ", $tokens);

Bunu imploding sonra, bir diziye doğrudan belirteçleri iterek değilim unutmayın.

Ayrıca şu anda tüm yapıyorsun dize manipülasyon olmadan, aynı etkiyi elde etmek için normal bir ifade kullanabilirsiniz. Bu en zarif çözüm olurdu:

$string = "this is *noun but it is *name";

// Lets set up an empty array
$tokens = array();

preg_match_all('/\*\w+/m', $string, $tokens);
$tokens = $tokens[0]; // Only one sub-pattern, dropping unnecessary dimension.

var_dump($tokens);

Düzenli ifadeler şimdi başarmak için çalışıyoruz görevin başta tam tür yapmak için vardır. Genellikle (PHP Düzenli İfade motor kodu derlenmiş) elle dize manipülasyonlar yaparak daha hızlıdır.

Benim regex açıklamak için:

  • /: sınır başlar
  • \*, an asterisk (*)
  • \w: herhangi bir alfa-sayısal karakter veya alt çizgi
  • +, previous marker, 1 or more times. (match \w, bir ya da daha çok kez)
  • /: uç sınır
  • m: satırlı değiştirici

Değiştirmek

$tokens .= $storyArray[$i] + " ";

ile

$tokens .= $storyArray[$i]." ";

Ve

$tokensArray = split(' ', $tokens);

ile

$tokensArray = split(' ', rtrim($tokens));
$tokens .= $storyArray[$i] + " ";

Bu hat, sen kullanıyor olmalıdır. dizeleri bitiştirmek için operatör.