2017-12-20 6 views
-2

は、私は、この要素のブラックリストを持っていると言いますその文字列中の各要素の配列をブラックリストからの配列を除いて取得しますか?フェッチする方法の要素は、要素の指定された配列と一致しない

+0

なぜダウン票を説明しますか? – user285001

+3

私はdownvoteをしませんでしたが、あなた自身が問題の試みを表示していない可能性があります。 – ctwheels

+3

それは私のものではありませんでしたが、私はそれはあなたがあなたが何を試してみたかを示していないからです(http://meta.stackoverflow.com/questions/261592)。 [**最小、完全で検証可能な例**]で試行してください(http://stackoverflow.com/help/mcve)。 –

答えて

0

多分可能です!私はこの方法をsuggere:

<?php 
$bl = array('sit', 'consectetur','adipiscing', ',', '.', ' '); 
$subject = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; 
$a_subject = explode(' ', $subject); 
$a_subject_filtered = array_filter($a_subject, function($item) use ($bl){ 
    return !in_array($item, $bl); 
}); 
+0

私はdownvotesを使い果たしましたが、この答えには解析エラーの原因となる誤植があり、それを修正した後には望む結果が得られません。将来の読者には役立たないため、この回答を更新または削除してください(実際、非効率的/間接的な方法を教えるために時間を無駄にします)。 – mickmackusa

+0

欠落した ';'を追加した編集の後、この回答は期待される結果を提供しません。もう一度更新するか、削除してください。 – mickmackusa

1

それは与えられた情報との決定的な答えを出すのは難しいです。あなたはどのように要素を定義するのですか?あなたのブロックリストの中にスペースがあり、昏睡状態で、ピリオドで区切られているだけなので、単語を除いてすべてを残していますか、それとも要素なのですか?他の句読点はどうですか?ここでは可能な解決策はあるが、それはそれはあなたのために働くだろうかどうかについて、いくつかの未知の要因に依存するであろう:

$bl = [ 
    'sit', 
    'consectetur', 
    'adipiscing', 
]; 
$subject = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; 

// REMOVE PUNCTUATION. Add punctuation you want to omit in the brackets 
$subject = preg_replace("#[,.]#", '', $subject); 

// GET DIFFERENCE BETWEEN TWO ARRAYS 
$array = array_diff(
     preg_split("#\s+#", $subject), 
     $bl 
); 

print_r($array); 
1

preg_split()の1回のコールでそれをすべて行います。パターンは少し準備が必要です。ブラックリストアレイの各エントリを効果的に処理し、区切り文字のように扱います。呼び出しの4番目のパラメータは、空の要素が出力配列から確実に破棄されるようにします。

Pattern Demo/Official Breakdown

コード:(Demo

$blacklist=['sit','consectetur','adipiscing',',','.',' ']; 
$subject = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; 

foreach($blacklist as &$entry){ // & means modify by reference, this means $blacklist (not its copy) will be altered 
    if(ctype_alpha($entry)){ 
     $entry="\b{$entry}\b"; // wrap in word boundaries (str_replace doesn't offer this accuracy) 
    }else{ 
     $entry="\Q{$entry}\E"; // make non-word literal, no word boundaries required 
    } 
} 
$pattern='/'.implode('|',$blacklist).'/i'; 
// generates: '/\bsit\b|\bconsectetur\b|\badipiscing\b|\Q,\E|\Q.\E|\Q \E/i' 
var_export(preg_split($pattern,$subject,NULL,PREG_SPLIT_NO_EMPTY)); // this treats each blacklisted words as a delimiter 

出力:あなたができる、正規表現を使用しない柔軟性の低い代替法として

array (
    0 => 'Lorem', 
    1 => 'ipsum', 
    2 => 'dolor', 
    3 => 'amet', 
    4 => 'elit', 
) 

str_word_count()の魔法を利用する - これは望ましいアウトを提供するstr_word_count()がどのように句読点を処理するかによって、サンプル入力データを入れてください。 array_diff()はちょうど両方の配列に存在するすべての要素を削除します。

コード:(Demo

$bl = array('sit', 'consectetur','adipiscing', ',', '.', ' '); // the , . and space elements could be removed here 
$subject = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; 

var_export(array_diff(str_word_count($subject,1),$bl)); // if you use strtolower() on $subject, you will get case-insensitive comparisons, but then you will have modified output values. :( This is just one reason why this not a robust method. 

出力:

array (
    0 => 'Lorem', 
    1 => 'ipsum', 
    2 => 'dolor', 
    4 => 'amet', 
    7 => 'elit', 
) 
関連する問題