質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

3回答

6710閲覧

文字列で「2回以上出現する単語があるかどうか」と「その単語」を判定したい

ltcmdr927

総合スコア13

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

1クリップ

投稿2016/10/25 00:55

編集2016/10/25 00:57

次のような文字列があるとします。

PHP

1$words = "one,two!three?four-five/five/six+";

この $words に代入された文字列に five/ という単語が2回以上連続して出現していることを判定し、なおかつその five/ という文字列を単語の候補等を使わずに取得したい(文字列内で2回以上出現している単語を列挙したい)のですが、正規表現ないしは PHP のいずれかで実現することは可能でしょうか。

なお、

PHP

1$words = "one,two!three?four-five/six+four-";

この four- のように2回以上出現する単語が離れている場合は考慮しなくてよいものとしたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popobot

2016/10/25 01:04

単語の切れ目(セパレータ)は決まっているのでしょうか? というのは文字列の中のどれが単語なのかどうやって判断すればいいのでしょうか? onetwoというのは一つの単語ですか?それとも2つの単語ですか?
s.t.

2016/10/25 01:06

「英単語」であることは必須でしょうか?また、onやourのような単語も混ざっておりますが、どのような扱いになりますか?
ltcmdr927

2016/10/25 01:10

>icchii 様 単語の切れ目(セパレータ)は不定です。文字列内において同じ文字が繰り返されている箇所を単語として判定したいと思っております。上記の例ですと「five/」が1つの単語として判定できれば良いです。
ltcmdr927

2016/10/25 01:11

>s.t. 様 英単語であることは必須ではありません。
guest

回答3

0

遅かった・・・orz

連続重複している文字列が複数あった場合がよくわからなかったので、正規表現なしで書いてみました。
複雑ですいません。

PHP

1<?php 2 3$words = "one,two!three?three?four-five/five/six+"; 4 5$wordsLength = strlen($words); 6$array = array(); 7 8//検索対象文字列の長さの半分+1文字以上の検索は無意味 9//iは文字数,jは位置。2文字以上の単語を対象。1文字以上にする場合はiのスタートを1に。 10for ($i = 2; $i <= $wordsLength+1; $i++) { 11 for($j = 0; $j <= $wordsLength; $j++){ 12 //検索キーワード抽出 13 $sample = substr($words,$j,$i); 14 15 $frontPosition = strpos($words,$sample); 16 $backPosition = strrpos($words,$sample); 17 18 if($frontPosition != $backPosition){ 19 $sampleLength = strlen($sample); 20 $renzoku = substr($words,$frontPosition+$sampleLength,$sampleLength); 21 if($sample == $renzoku){ 22 array_push($array,$sample); 23 } 24 } 25 } 26} 27 28$arrayNew = array_unique($array); 29 30echo "連続して重複しているのは"; 31foreach($arrayNew as $value){ 32 echo $value."\n"; 33} 34 35?>

投稿2016/10/25 02:32

s.t.

総合スコア2021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ltcmdr927

2016/10/25 02:49

ありがとうございます。こちらもご参考させて頂きます。
guest

0

正規表現の「後方参照」という機能を使えば可能です。

php

1$result = preg_match('/(.+)\\1/u', $words);

…と思って試してみたら、threeの「ee」を拾ってしまいました。「1単語」に求める条件をはっきりさせれば、前方のカッコ内にそれを入れることで、さらに正しく絞り込めます。

投稿2016/10/25 01:09

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ltcmdr927

2016/10/25 01:20

ありがとうございます。 1単語の条件ですが、最低限のものとしては「半角英文字2文字以上+半角記号」というかたちになります。
guest

0

ベストアンサー

PHP

1$words = "one,two!three?four-five/five/six+"; 2$pattern="/(.{2,})\\1/"; 3preg_match($pattern,$words,$match); 4print_r($match);

投稿2016/10/25 01:32

yambejp

総合スコア114814

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ltcmdr927

2016/10/25 02:16

ありがとうございます。判定することができました。
think49

2016/10/25 09:14

解決済みのようですが、このコードは "ringing", "Yhaaaa!!", "great!!!!" にもマッチすると思われますのでご注意ください。 (回答時点では「単語」の条件が曖昧だったのが原因だと思いますが…)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問