PHP preg_split değilse kaşlı ayraçlar içinde

4 Cevap php

Ben PHP kullanarak bir betik dili tercümanı yapıyveyaum. Ben bu betik dili bu kodu vardır:

yazmak {Hello, Wveyald!} içiçindede ya da the renk {blue} veya {red} veya {#00AA00} ve içiçindede ya da the yazı {Arial Black} veya {Monaco} nerede her ikisi de the renk ve the yazı vardır determiçiçindedeed rveomly

(Evet, içiçindedeanması zveya ama bu sözdizimi)

Hangi regex Ben bu (boşluklarla bölünmüş) bölmek içiçiçindede kullanmak gerekir ama sadece kıvırcık parantez içiçiçindedede eğer. Yani bu diziye yukarıdaki kodu açmak istiyveyaum:

  1. yazmak
  2. Hello, Wveyald!
  3. içiçindede
  4. ya da
  5. the
  6. renk
  7. blue
  8. veya
  9. red
  10. veya
  11. #00AA00
  12. ve
  13. içiçindede
  14. ya da
  15. the
  16. yazı
  17. Arial Black
  18. veya
  19. Monaco
  20. nerede
  21. her ikisi de
  22. the
  23. renk
  24. ve
  25. yazı
  26. vardır
  27. determiçiçindedeed
  28. rveomly

(The striçiçindedegs içiçindedeside the curly brackets vardır show above içiçindede bold) The striçiçindedegs içiçindedeside the curly brackets must be one element each. So {Hello, Wveyald!} cannot be: 1. Hello, 2. Wveyald!

Bunu nasıl yapabilirim?

Şimdiden teşekkürler.

4 Cevap

ne böyle bir şey kullanma hakkında:

$str = 'write {Hello, World!} in either the color {blue} or {red} or {#00AA00} and in either the font {Arial Black} or {Monaco} where both the color and the font are determined randomly';

$matches = array();
preg_match_all('#\{.*?\}|[^ ]+#', $str, $matches);

var_dump($matches[0]);

Seni alacak olan:

array
  0 => string 'write' (length=5)
  1 => string '{Hello, World!}' (length=15)
  2 => string 'in' (length=2)
  3 => string 'either' (length=6)
  4 => string 'the' (length=3)
  5 => string 'color' (length=5)
  6 => string '{blue}' (length=6)
  7 => string 'or' (length=2)
  8 => string '{red}' (length=5)
  9 => string 'or' (length=2)
  10 => string '{#00AA00}' (length=9)
  11 => string 'and' (length=3)
  12 => string 'in' (length=2)
  13 => string 'either' (length=6)
  14 => string 'the' (length=3)
  15 => string 'font' (length=4)
  16 => string '{Arial Black}' (length=13)
  17 => string 'or' (length=2)
  18 => string '{Monaco}' (length=8)
  19 => string 'where' (length=5)
  20 => string 'both' (length=4)
  21 => string 'the' (length=3)
  22 => string 'color' (length=5)
  23 => string 'and' (length=3)
  24 => string 'the' (length=3)
  25 => string 'font' (length=4)
  26 => string 'are' (length=3)
  27 => string 'determined' (length=10)
  28 => string 'randomly' (length=8)

, Sadece bu sonuçları yineleme var; tarafından başlayarak {ve sona eren} olanları "önemli" sözleri olacaktır, ve diğerleri dinlenme olacaktır.


Edit after the comment : one way to identify the important words would be something like this :

foreach ($matches[0] as $word) {
    $m = array();
    if (preg_match('#^\{(.*)\}$#', $word, $m)) {
        echo '<strong>' . htmlspecialchars($m[1]) . '</strong>';
    } else {
        echo htmlspecialchars($word);
    }
    echo '<br />';
}

Dediğin gibi ya, strpos ve strlen ile çalışan çok çalışmak istiyorum ;-)

Sırası önemli mi? Eğer değilse, her {} 'in ayıklamak onları kaldırmak olabilir, daha sonra kalan dize üzerinde çalışır.

I preg_replace_callback kullanarak onları yerini alacak. Geri arama ile sipariş takip ve% var1,%%% var2'ye, vb gibi bir şey ile değiştirin

Ben önceden dize değiştirmeden kıvırcık parantez boşluklarla patlamaya bir yol olduğunu düşünüyorum, ama yok.

Bu regexp olmadan iterately yapılabilir. Sen tüm dize üzerinde yineleme. Eğer bir alan bulmak sürece, geçici bir değişken her karakter koymak. Bir boşluk bulduğunuzda, dizideki geçici değişkenin içerik koymak, boşaltın ve sonra devam edin.

Eğer bir dirsek bulursanız, bir boolean ayarlayın ve bir kapanış dirseği bulana kadar sonra, temp var her şeyi koymak. Ve böylece.

<?php
$string = "write {Hello, World!} in either the color {blue} or {red} or {#00AA00} and in either the font {Arial Black} or {Monaco} where both the color and the font are determined randomly";
$bracket = false;
$words = array();
$temp = "";

for($i = 0; $i < strlen($string); $i++){    
    $char = $string[$i]
    if($bracket){
    	$temp .= $char;
    	if($char == "}"){
    		$bracket = false;
    		$words[] = $temp;
    	}
    }
    else{
    	if($char == " "){
    		if($temp != ""){
    			$words[] = $temp;
    			$temp = "";
    		}
    	}
    	elseif($char == "{"}{
    		$temp .= $char;
    		$bracket = true;
    	}
    	else{
    		$temp .= $char;
    	}
    }
}
?>

Kod denenmemiştir.