0

私はこれを尋ねるのを控えており、可能な限り調査していますが、まだ解決策を見つけることができません.

他のアプリを開始する特定のトークンがある PHP アプリケーションがあります。

たとえば、このような変数があります

%APP:name_of_the_app|ID:123123123%

このタイプのタグの文字列を検索し、「APP」と「ID」の値を抽出する必要があります。定義済みの他のトークンもあり、それらは % で始まり、% で終わるため、別の文字を使用して開いて開く必要がある場合大丈夫なトークンを閉じます。

APP は英数字で、- または _ を含む場合があります ID は数字のみです

ありがとう!

4

1 に答える 1

3

キャプチャ グループを使用した正規表現が適切に機能するはずです ( /%APP:(.*?)\|ID:([0-9]+)%/):

$string = "This is my string but it also has %APP:name_of_the_app|ID:123123123% a bunch of other stuff in it";

$apps = array();
if (preg_match_all("/%APP:(.*?)\|ID:([0-9]+)%/", $string, $matches)) {
    for ($i = 0; $i < count($matches[0]); $i++) {
        $apps[] = array(
            "name" => $matches[1][$i],
            "id"   => $matches[2][$i]
        );
    }
}
print_r($apps);

これにより、次のことが得られます。

Array
(
    [0] => Array
        (
            [name] => name_of_the_app
            [id] => 123123123
        )

)

strposまたは、トークンの名前を指定せずにandを使用substrして同じことを行うこともできます (ただし、文字列の途中でパーセント記号を使用するとバグが発生します)。

<?php
    $string = "This is my string but it also has %APP:name_of_the_app|ID:123123123|whatevertoken:whatevervalue% a bunch of other stuff in it";

    $inTag = false;
    $lastOffset = 0;

    $tags = array();
    while ($position = strpos($string, "%", $offset)) {
        $offset = $position + 1;
        if ($inTag) {
            $tag = substr($string, $lastOffset, $position - $lastOffset);
            $tagsSingle = array();
            $tagExplode = explode("|", $tag);
            foreach ($tagExplode as $tagVariable) {
                $colonPosition = strpos($tagVariable, ":");
                $tagsSingle[substr($tagVariable, 0, $colonPosition)] = substr($tagVariable, $colonPosition + 1);
            }
            $tags[] = $tagsSingle;
        }
        $inTag = !$inTag;
        $lastOffset = $offset;
    }

    print_r($tags);
?>

これにより、次のことが得られます。

Array
(
    [0] => Array
        (
            [APP] => name_of_the_app
            [ID] => 123123123
            [whatevertoken] => whatevervalue
        )

)

デモ

于 2013-09-25T13:59:09.373 に答える