0

スピン構文を使用して単語(事前定義済み)を段落に挿入できるようにする、自分のサイト用のphpスクリプトを作成しようとしています。1つのスクリプトで複数回実行する方法がわかりません。たとえば、次のような段落があります。

{太った|ずんぐりした|怠惰な}犬は一日中{眠る|休む|うんち}。

スクリプトが{text1| text 2}中括弧の間にあるテキストの各グループにアクセスできるようにしてから、使用する変数をランダムに選択しようとしています(パイプで区切られています)。それが行われると、次のような文字列の多くのバリエーションが吐き出されます。

  1. 太った犬は一日中眠ります。
  2. 怠惰な犬は一日中うんちをします。等。

{}角かっこで囲まれたテキストの最初のインスタンスにアクセスし、それを回転させることはできますが、1回の急降下で複数回実行する方法がわかりません。誰かがこれをしたことがありますか?

これは、最初の2つの{}括弧の間にあるテキストの最初のインスタンスにアクセスするためのスクリプトです。

function get_between ($text, $s1, $s2) {
    $spinText = "";
    $pos_s = strpos($text,$s1);
    $pos_e = strpos($text,$s2);
    for ( $i=$pos_s+strlen($s1) ; (( $i<($pos_e)) && $i < strlen($text)) ; $i++ ) {
            $spinText .= $text[$i];
    }
    return $spinText;
}
$str = "The {fat|pudgy|lazy} dog {sleeps|rest|poops} all day long.";
$spinTextFinal = get_between($str,"{","}");

$spinTextFinalExplode = explode("|",$spinTextFinal);
print_r($spinTextFinalExplode);
4

2 に答える 2

1

解決策1:次を使用できますpreg_replace_callback

$str = "The {fat|pudgy|lazy} dog {sleeps|rest|poops} all day long.";
echo "<pre>";
for($i = 0; $i < 10; $i ++) {
    echo get_between($str, "{", "}"), PHP_EOL;
}

出力

The fat dog rest all day long.
The lazy dog poops all day long.
The fat dog sleeps all day long.
The lazy dog sleeps all day long.
The lazy dog poops all day long.
The lazy dog poops all day long.
The pudgy dog rest all day long.
The pudgy dog rest all day long.
The fat dog poops all day long.
The fat dog rest all day long.

変更された機能

function get_between($text, $s1, $s2) {
    $text = preg_replace_callback(sprintf("/%s(.*?)%s/", preg_quote($s1), preg_quote($s2)), function ($m) {
        $l = explode("|", $m[1]);
        return $l[array_rand($l)];
    }, $text);
    return $text;
}

解決策2配列を使用するだけ

$arr1 = array("fat","pudgy","lazy");
$arr2 = array("sleeps","rest","poops");
$str = "The %s dog %s all day long.";
echo sprintf($str,$arr1[array_rand($arr1)],$arr1[array_rand($arr1)]);
于 2012-12-12T19:08:53.667 に答える
0

理解した :)

$str = "The {fat|pudgy|lazy} dog {sleeps|rest|poops} all day long.";
$start_string ='{';
$stop_string = '}';
preg_match_all('/' . $start_string. '(.*)' . $stop_string . '/Usi' , $str, $strings); 
foreach($strings[1] as &$value){
    $explodePhrase = explode("|",$value);
    $key = array_rand($explodePhrase);
    $valueX = $explodePhrase[$key];
    $string[$value] = $valueX; 
}
foreach($string as $key => $value){
    $str = str_replace($key,$value,$str);
    $str = $str; 
}
echo $str; 
于 2012-12-12T18:50:40.917 に答える