7

この正規表現を作成しました

(www|http://)[^ ]+

すべてのhttp://...またはwww....に一致しますが、 preg_replace を機能させる方法がわかりません。試してみました

preg_replace('/((www|http://)[^ ]+)/', '<a href="\1">\1</a>', $str);

結果は空の文字列です。


Prism を使用して StackPanel をデータバインドする

Prism を使用して、StockTraderRI プロジェクトと同様のビュー、モデル、およびプレゼンターを実装しました。私の問題は、スタックパネルを ObservableCollection オブジェクトにデータバインドしようとしていますが、文字列が表示されていないことです。

これが私のコードです:

プレゼンテーションモデル コード:

    public InfoBarPresentationModel(IInfoBarView view, IEventAggregator eventAggregator)
    {
        this.View = view;
        this.View.Model = this;
        InfoBarItems = new ObservableCollection<string>();
        InfoBarItems.Add("Test 1");
        InfoBarItems.Add("Test 2");
    }

    public IInfoBarView View { get; set; }

    public ObservableCollection<string> InfoBarItems { get; set; }

XAML コード:

<ItemsControl x:Name="list" ItemsSource="{Binding InfoBarItems}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBox Text="{Binding}"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

さまざまなバインディングの組み合わせを試しましたが、文字列が表示されない理由はまだわかりません。私は何を間違っていますか?

リック

4

6 に答える 6

14

スラッシュを区切り文字として使用しているため、正規表現でスラッシュをエスケープする必要があります。別の記号を区切り記号として使用することもできます。

// escaped
preg_replace('/((www|http:\/\/)[^ ]+)/', '<a href="\1">\1</a>', $str);

// another delimiter, '@'
preg_replace('@((www|http://)[^ ]+)@', '<a href="\1">\1</a>', $str);
于 2009-07-04T21:15:28.907 に答える
2

まず第一に、他の回答で説明されているように、区切り文字をエスケープするか、さらには置き換える必要があります。

preg_replace('~((www|http://)[^ ]+)~', '<a href="\1">\1</a>', $str);

次に、正規表現をさらに改善するために、マニュアルに記載されているように、$n置換参照構文が優先されます。\\n

preg_replace('~((www|http://)[^ ]+)~', '<a href="$1">$1</a>', $str);

第 3 に、キャプチャー括弧を不必要に使用しているため、速度が低下するだけです。それらを取り除きます。$1に更新することを忘れないでください$0。ご参考までに、これらは非キャプチャ括弧です: (?: ).

preg_replace('~(?:www|http://)[^ ]+~', '<a href="$0">$0</a>', $str);

最後に、の反対である、[^ ]+より短くより正確なに置き換えます。スペースは使用できませんが、改行とタブは使用できます。ではない。\S\s[^ ]+\S

preg_replace('~(?:www|http://)\S+~', '<a href="$0">$0</a>', $str);
于 2009-07-04T21:33:37.170 に答える
2

他のユーザーから提供された正規表現コードを使用する場合は、「i」フラグを追加して大文字と小文字を区別しないようにしてください。これにより、HTTP:// と http:// の両方で機能します。たとえば、chaos のコードを使用すると、次のようになります。

preg_replace('!(www|http://[^ ]+)!i', '<a href="\1">\1</a>', $str);
于 2009-07-04T21:26:02.023 に答える
1

あなたの主な問題は、すべてを括弧で囲んでいるため、「\ 1」が何であるかがわからないことです。また、「/」をエスケープする必要があります。だからこれを試してください:

preg_replace('/(www|http:\/\/[^ ]+)/', '<a href="\1">\1</a>', $str);

編集:実際には括弧は問題ではなかったようです。読み間違えました。他の人も指摘しているように、脱出は依然として問題でした。どちらのソリューションも機能するはずです。

于 2009-07-04T21:15:03.387 に答える
1
preg_replace('!((?:www|http://)[^ ]+)!', '<a href="\1">\1</a>', $str);

/パターン区切り文字として使用する場合、パターン/内にあるとうまくいきません。パターン区切り文字として使用してこれを解決しまし!たが、代わりにバックスラッシュを使用してスラッシュをエスケープできます。

また、2 つのペアレン キャプチャを行っている理由もわからなかったので、そのうちの 1 つを削除しました。

あなたの状況での問題の一部は、警告を抑制して実行していることです。使用していた場合error_reporting(E_ALL)は、正規表現の区切り文字の問題について PHP が生成しようとしているメッセージを見たことがあるでしょう。

于 2009-07-04T21:14:58.067 に答える
1

スペースの代わりに改行で区切られた文字列に複数の URL が含まれている場合は、\S を使用する必要があります。

preg_replace('/((www|http:\/\/)\S+)/', '<a href="$1">$1</a>', $val);
于 2012-10-19T15:57:48.103 に答える