พิจารณา:
$a = 'How are you?';
if ($a contains 'are')
echo 'true';
สมมติว่าฉันมีรหัสข้างต้นเป็นวิธีที่ถูกต้องในการเขียนคำสั่งif ($a contains 'are')
คืออะไร?
พิจารณา:
$a = 'How are you?';
if ($a contains 'are')
echo 'true';
สมมติว่าฉันมีรหัสข้างต้นเป็นวิธีที่ถูกต้องในการเขียนคำสั่งif ($a contains 'are')
คืออะไร?
คำตอบ:
คุณสามารถใช้strpos()
ฟังก์ชั่นที่ใช้ในการค้นหาการเกิดขึ้นของหนึ่งสายภายในอีกหนึ่ง:
$a = 'How are you?';
if (strpos($a, 'are') !== false) {
echo 'true';
}
หมายเหตุว่าการใช้!== false
เป็นเจตนา (ค่า!= false
มิได้=== true
จะกลับมาผลที่ต้องการ); strpos()
ส่งกลับค่าออฟเซ็ตที่สตริงเข็มเริ่มต้นในสตริงแฮ็กสแต็กหรือบูลีนfalse
หากไม่พบเข็ม เนื่องจาก 0 เป็น offset ที่ถูกต้องและ 0 คือ "falsey" เราจึงไม่สามารถใช้โครงสร้างที่ง่ายกว่า!strpos($a, 'are')
นี้ได้
strpos($a, 'are') > -1
เพื่อทดสอบจริงเสมอ จากมุมมองการแก้ไขข้อบกพร่องฉันพบว่าสมองของฉันสิ้นเปลืองวงจรนาฬิกาน้อยลงหากพิจารณาว่าบรรทัดถูกเขียนอย่างถูกต้องหรือไม่เมื่อฉันไม่ต้องนับสัญญาณที่ต่อเนื่องกัน
คุณสามารถใช้นิพจน์ทั่วไปได้ดีกว่าสำหรับการจับคู่คำเมื่อเทียบกับstrpos
ที่กล่าวถึงโดยผู้ใช้คนอื่นมันจะคืนค่าจริงสำหรับสตริงเช่นค่าโดยสารการดูแลจ้อง ฯลฯ ซึ่งสามารถหลีกเลี่ยงได้ในการแสดงออกปกติโดยใช้ขอบเขตของคำ
การจับคู่แบบง่ายอาจมีลักษณะเช่นนี้:
$a = 'How are you?';
if (preg_match('/\bare\b/', $a)) {
echo 'true';
}
ทางด้านการแสดงstrpos
นั้นเร็วกว่าและมีอยู่ในใจประมาณสามเท่าเมื่อฉันเปรียบเทียบหนึ่งล้านครั้งในเวลาเดียวมันใช้เวลาpreg_match
1.5 วินาทีจึงจะเสร็จและstrpos
ใช้เวลา 0.5 วินาที
แก้ไข: เพื่อค้นหาส่วนหนึ่งส่วนใดของสตริงไม่ใช่แค่คำต่อคำฉันขอแนะนำให้ใช้นิพจน์ทั่วไปเช่น
$a = 'How are you?';
$search = 'are y';
if(preg_match("/{$search}/i", $a)) {
echo 'true';
}
i
ในตอนท้ายของการแสดงออกปกติที่มีการเปลี่ยนแปลงการแสดงออกปกติจะเป็นกรณีตายถ้าคุณไม่ต้องการที่คุณสามารถปล่อยให้มันออกมา
ตอนนี้อาจเป็นปัญหาได้ในบางกรณีเนื่องจากสตริงการค้นหา $ ไม่ได้รับการฆ่าเชื้อด้วยวิธีใด ๆ ฉันหมายความว่ามันอาจไม่ผ่านการตรวจสอบในบางกรณีราวกับว่า$search
เป็นอินพุตของผู้ใช้ที่พวกเขาสามารถเพิ่มสตริงที่อาจทำงานได้ บางคนแสดงออกปกติแตกต่างกัน ...
นอกจากนี้ยังเป็นเครื่องมือที่ยอดเยี่ยมสำหรับการทดสอบและดูคำอธิบายของนิพจน์ทั่วไปต่างๆRegex101
ในการรวมฟังก์ชั่นทั้งสองชุดไว้ในฟังก์ชั่นอเนกประสงค์เดียว (รวมถึงความไวของตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) คุณสามารถใช้สิ่งต่อไปนี้:
function FindString($needle,$haystack,$i,$word)
{ // $i should be "" or "i" for case insensitive
if (strtoupper($word)=="W")
{ // if $word is "W" then word search instead of string in string search.
if (preg_match("/\b{$needle}\b/{$i}", $haystack))
{
return true;
}
}
else
{
if(preg_match("/{$needle}/{$i}", $haystack))
{
return true;
}
}
return false;
// Put quotes around true and false above to return them as strings instead of as bools/ints.
}
นี่คือฟังก์ชั่นยูทิลิตี้เล็ก ๆ น้อย ๆ ที่มีประโยชน์ในสถานการณ์เช่นนี้
// returns true if $needle is a substring of $haystack
function contains($needle, $haystack)
{
return strpos($haystack, $needle) !== false;
}
if ($email->contains("@") && $email->endsWith(".com)) { ...
หรือif (strpos($email, "@") !== false && substr($email, -strlen(".com")) == ".com") { ...
ขณะที่ส่วนใหญ่ของคำตอบเหล่านี้จะบอกคุณถ้าปรากฏ substring ในสายของคุณที่มักจะไม่ได้สิ่งที่คุณต้องการหากคุณกำลังมองหาโดยเฉพาะอย่างยิ่งคำและไม่ย่อย
ความแตกต่างคืออะไร? สารตั้งต้นสามารถปรากฏในคำอื่น ๆ :
วิธีหนึ่งในการลดสิ่งนี้คือการใช้การแสดงออกปกติควบคู่กับขอบเขตของคำ ( \b
):
function containsWord($str, $word)
{
return !!preg_match('#\\b' . preg_quote($word, '#') . '\\b#i', $str);
}
วิธีการนี้ไม่มีผลบวกปลอมที่ระบุไว้ข้างต้น แต่มีบางกรณีที่เป็นขอบของมันเอง ขอบเขตของคำตรงกับตัวละครที่ไม่ใช่คำ ( \W
) ซึ่งกำลังจะเป็นอะไรที่ไม่a-z
, A-Z
, หรือ0-9
_
นั่นหมายถึงตัวเลขและขีดล่างจะถูกนับเป็นตัวอักษรคำและสถานการณ์เช่นนี้จะล้มเหลว:
หากคุณต้องการอะไรที่ถูกต้องมากกว่านี้คุณจะต้องเริ่มทำการแยกวิเคราะห์ไวยากรณ์ภาษาอังกฤษและนั่นก็เป็นเวิร์มขนาดใหญ่ที่น่าจับตามอง
\b
ตรงกับสองสิ่งที่\W
ไม่เหมาะสำหรับการค้นหาคำในสตริง: มันตรงกับจุดเริ่มต้นของสตริง ( ^
) และจุดสิ้นสุดของสตริง ( $
)
เพื่อตรวจสอบว่ามีสตริงสตริงคุณสามารถใช้ฟังก์ชัน PHP อีกstrpos ()
int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
<?php
$haystack = 'how are you';
$needle = 'are';
if (strpos($haystack,$needle) !== false) {
echo "$haystack contains $needle";
}
?>
ข้อควรระวัง:
หากเข็มที่คุณกำลังค้นหาอยู่ที่จุดเริ่มต้นของกองหญ้ามันจะกลับสู่ตำแหน่ง 0 หากคุณทำการ==
เปรียบเทียบที่ไม่ได้ผลคุณจะต้องทำ===
==
สัญญาณคือการเปรียบเทียบและการทดสอบว่าตัวแปร / การแสดงออก / คงที่ไปทางซ้ายมีค่าเช่นเดียวกับตัวแปร / การแสดงออก / คงไปทางขวา
===
สัญญาณคือการเปรียบเทียบเพื่อดูว่าสองตัวแปร / expresions / คงที่จะเท่ากันAND
มีชนิดเดียวกัน - คือทั้งสองสายหรือทั้งสองอย่างเป็นจำนวนเต็ม
<?php
$mystring = 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme);
// Note our use of ===. Simply, == would not work as expected
// because the position of 'a' was the 0th (first) character.
if ($pos === false) {
echo "The string '$findme' was not found in the string '$mystring'.";
}
else {
echo "The string '$findme' was found in the string '$mystring',";
echo " and exists at position $pos.";
}
?>
strstr($a, 'are')
นั้นสง่างามยิ่งกว่าขี้เหร่strpos($a, 'are') !== false
มาก PHP ต้องการstr_contains()
ฟังก์ชั่น
ใช้ประโยชน์จากการจับคู่ case-insensitveโดยใช้stripos()
:
if (stripos($string,$stringToSearch) !== false) {
echo 'true';
}
แสดงความคิดเห็นกับ SamGoody และ Lego Stormtroopr
หากคุณกำลังมองหาอัลกอริทึม PHP เพื่อจัดอันดับผลการค้นหาตามความใกล้เคียง / ความเกี่ยวข้องของคำหลายคำนี่เป็นวิธีที่รวดเร็วและง่ายดายในการสร้างผลลัพธ์การค้นหาด้วย PHP เท่านั้น:
ปัญหาเกี่ยวกับวิธีการค้นหาแบบตรรกะอื่น ๆ เช่นstrpos()
, preg_match()
, strstr()
หรือstristr()
วิธี PHP ตามVector Space Modelและtf-idf (คำศัพท์ความถี่ - ความถี่เอกสารผกผัน)
ฟังดูยาก แต่ก็ง่ายอย่างน่าประหลาดใจ
หากเราต้องการค้นหาคำหลาย ๆ คำในสตริงปัญหาหลักคือเรากำหนดน้ำหนักให้แต่ละคำได้อย่างไร
ถ้าเราสามารถลดน้ำหนักในแง่สตริงขึ้นอยู่กับวิธีที่พวกเขาเป็นตัวแทนของสตริงเป็นทั้งเราสามารถสั่งซื้อผลของเราโดยคนที่ดีที่สุดตรงกับแบบสอบถาม
นี่เป็นแนวคิดของโมเดลพื้นที่เวกเตอร์ซึ่งอยู่ไม่ไกลจากวิธีการค้นหาข้อความแบบเต็มของ SQL:
function get_corpus_index($corpus = array(), $separator=' ') {
$dictionary = array();
$doc_count = array();
foreach($corpus as $doc_id => $doc) {
$terms = explode($separator, $doc);
$doc_count[$doc_id] = count($terms);
// tf–idf, short for term frequency–inverse document frequency,
// according to wikipedia is a numerical statistic that is intended to reflect
// how important a word is to a document in a corpus
foreach($terms as $term) {
if(!isset($dictionary[$term])) {
$dictionary[$term] = array('document_frequency' => 0, 'postings' => array());
}
if(!isset($dictionary[$term]['postings'][$doc_id])) {
$dictionary[$term]['document_frequency']++;
$dictionary[$term]['postings'][$doc_id] = array('term_frequency' => 0);
}
$dictionary[$term]['postings'][$doc_id]['term_frequency']++;
}
//from http://phpir.com/simple-search-the-vector-space-model/
}
return array('doc_count' => $doc_count, 'dictionary' => $dictionary);
}
function get_similar_documents($query='', $corpus=array(), $separator=' '){
$similar_documents=array();
if($query!=''&&!empty($corpus)){
$words=explode($separator,$query);
$corpus=get_corpus_index($corpus, $separator);
$doc_count=count($corpus['doc_count']);
foreach($words as $word) {
if(isset($corpus['dictionary'][$word])){
$entry = $corpus['dictionary'][$word];
foreach($entry['postings'] as $doc_id => $posting) {
//get term frequency–inverse document frequency
$score=$posting['term_frequency'] * log($doc_count + 1 / $entry['document_frequency'] + 1, 2);
if(isset($similar_documents[$doc_id])){
$similar_documents[$doc_id]+=$score;
}
else{
$similar_documents[$doc_id]=$score;
}
}
}
}
// length normalise
foreach($similar_documents as $doc_id => $score) {
$similar_documents[$doc_id] = $score/$corpus['doc_count'][$doc_id];
}
// sort from high to low
arsort($similar_documents);
}
return $similar_documents;
}
กรณีที่ 1
$query = 'are';
$corpus = array(
1 => 'How are you?',
);
$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
print_r($match_results);
echo '</pre>';
ผลลัพธ์
Array
(
[1] => 0.52832083357372
)
กรณีที่ 2
$query = 'are';
$corpus = array(
1 => 'how are you today?',
2 => 'how do you do',
3 => 'here you are! how are you? Are we done yet?'
);
$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
print_r($match_results);
echo '</pre>';
ผล
Array
(
[1] => 0.54248125036058
[3] => 0.21699250014423
)
กรณีที่ 3
$query = 'we are done';
$corpus = array(
1 => 'how are you today?',
2 => 'how do you do',
3 => 'here you are! how are you? Are we done yet?'
);
$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
print_r($match_results);
echo '</pre>';
ผล
Array
(
[3] => 0.6813781191217
[1] => 0.54248125036058
)
มีมากมายของการปรับปรุงที่จะทำมี แต่รูปแบบมีวิธีการได้รับผลดีจากการสืบค้นธรรมชาติซึ่งไม่ได้มีการดำเนินการทางตรรกะเช่นstrpos()
, preg_match()
, หรือstrstr()
stristr()
NOTA BENE
เลือกกำจัดความซ้ำซ้อนก่อนค้นหาคำ
จึงลดขนาดดัชนีและทำให้ต้องการพื้นที่จัดเก็บน้อยลง
I / O ของดิสก์น้อยลง
การจัดทำดัชนีที่เร็วขึ้นและการค้นหาที่เร็วขึ้น
1. การทำให้เป็นมาตรฐาน
2. การกำจัดคำหยุด
3. การทดแทนพจนานุกรม
แทนที่คำด้วยคำอื่น ๆ ที่มีความหมายเหมือนหรือคล้ายกัน (เช่นแทนที่อินสแตนซ์ 'hungrily' และ 'หิว' ด้วย 'หิว')
อาจใช้มาตรการอัลกอริธึมเพิ่มเติม (สโนว์บอล) เพื่อลดคำต่อความหมายที่จำเป็น
การแทนที่ชื่อสีด้วยค่าฐานสิบหกที่เทียบเท่ากัน
การลดค่าตัวเลขโดยการลดความแม่นยำเป็นวิธีการอื่นในการทำให้ข้อความเป็นมาตรฐาน
ทรัพยากร
หากคุณต้องการหลีกเลี่ยงปัญหา "เท็จ" และ "ความจริง" คุณสามารถใช้ substr_count:
if (substr_count($a, 'are') > 0) {
echo "at least one 'are' is present!";
}
มันช้ากว่า strpos เล็กน้อย แต่ก็หลีกเลี่ยงปัญหาการเปรียบเทียบ
false
สำหรับ "คุณแน่ใจเหรอ?" เนื่องจากตำแหน่งสำหรับstrpos
คือ0
อีกทางเลือกหนึ่งคือใช้ฟังก์ชั่นstrstr () สิ่งที่ต้องการ:
if (strlen(strstr($haystack,$needle))>0) {
// Needle Found
}
จุดที่ควรทราบ: ฟังก์ชั่น strstr () เป็นกรณี ๆ ไป สำหรับการค้นหากรณีตายใช้stristr ()ฟังก์ชั่น
if (preg_match('/(are)/', $a)) {
echo 'true';
}
WARNING preg_match(): Delimiter must not be alphanumeric or backslash
ฉันบิตประทับใจไม่มีคำตอบที่นี่เป็นที่ที่ใช้strpos
, strstr
และฟังก์ชั่นที่คล้ายกันกล่าวถึงฟังก์ชั่นหลายไบต์สตริงเลย (2015/05/08)
โดยทั่วไปหากคุณมีปัญหาในการค้นหาคำที่มีอักขระเฉพาะสำหรับบางภาษาเช่นเยอรมันฝรั่งเศสโปรตุเกสสเปน ฯลฯ (เช่น: ä , é , ô , ç , º , ñ ) คุณอาจต้องการนำหน้า mb_
ฟังก์ชั่นที่มี ดังนั้นคำตอบที่ยอมรับจะใช้mb_strpos
หรือmb_stripos
(สำหรับการจับคู่แบบตรงตามตัวพิมพ์เล็กและใหญ่) แทน:
if (mb_strpos($a,'are') !== false) {
echo 'true';
}
หากคุณไม่สามารถรับประกันได้ว่าข้อมูลทั้งหมดของคุณเป็น 100% ใน UTF-8คุณอาจต้องการใช้mb_
ฟังก์ชั่น
บทความที่ดีที่จะเข้าใจว่าทำไมเป็นนักพัฒนาแอปโซลูทุกขั้นต่ำของซอฟท์แวแน่นอนบวกต้องทราบเกี่ยวกับ Unicode และชุดตัวอักษร (ไม่มีข้อแก้ตัว!)โดยโจ Spolsky
ใน PHP วิธีที่ดีที่สุดในการตรวจสอบว่าสตริงมีซับสตริงที่แน่นอนหรือไม่คือการใช้ฟังก์ชันตัวช่วยอย่างง่ายเช่นนี้
function contains($haystack, $needle, $caseSensitive = false) {
return $caseSensitive ?
(strpos($haystack, $needle) === FALSE ? FALSE : TRUE):
(stripos($haystack, $needle) === FALSE ? FALSE : TRUE);
}
strpos
ค้นหาตำแหน่งของการเกิดขึ้นครั้งแรกของสตริงย่อยที่เล็กตามตัวอักษรในสตริงstripos
ค้นหาตำแหน่งของการเกิดขึ้นครั้งแรกของสตริงย่อยที่ไม่คำนึงถึงขนาดตัวพิมพ์ในสตริงmyFunction($haystack, $needle) === FALSE ? FALSE : TRUE
ตรวจสอบให้แน่ใจว่าmyFunction
ส่งคืนบูลีนเสมอและแก้ไขพฤติกรรมที่ไม่คาดคิดเมื่อดัชนีของสตริงย่อยเป็น 0$caseSensitive ? A : B
เลือกอย่างใดอย่างหนึ่งstrpos
หรือจะทำผลงานขึ้นอยู่กับมูลค่าของstripos
$caseSensitive
var_dump(contains('bare','are')); // Outputs: bool(true)
var_dump(contains('stare', 'are')); // Outputs: bool(true)
var_dump(contains('stare', 'Are')); // Outputs: bool(true)
var_dump(contains('stare', 'Are', true)); // Outputs: bool(false)
var_dump(contains('hair', 'are')); // Outputs: bool(false)
var_dump(contains('aren\'t', 'are')); // Outputs: bool(true)
var_dump(contains('Aren\'t', 'are')); // Outputs: bool(true)
var_dump(contains('Aren\'t', 'are', true)); // Outputs: bool(false)
var_dump(contains('aren\'t', 'Are')); // Outputs: bool(true)
var_dump(contains('aren\'t', 'Are', true)); // Outputs: bool(false)
var_dump(contains('broad', 'are')); // Outputs: bool(false)
var_dump(contains('border', 'are')); // Outputs: bool(false)
ฟังก์ชั่นด้านล่างใช้งานได้และไม่ขึ้นอยู่กับฟังก์ชั่นอื่น ๆ มันใช้การจัดการสตริง PHP ดั้งเดิมเท่านั้น ส่วนตัวผมไม่แนะนำสิ่งนี้ แต่คุณสามารถดูวิธีการทำงาน:
<?php
if (!function_exists('is_str_contain')) {
function is_str_contain($string, $keyword)
{
if (empty($string) || empty($keyword)) return false;
$keyword_first_char = $keyword[0];
$keyword_length = strlen($keyword);
$string_length = strlen($string);
// case 1
if ($string_length < $keyword_length) return false;
// case 2
if ($string_length == $keyword_length) {
if ($string == $keyword) return true;
else return false;
}
// case 3
if ($keyword_length == 1) {
for ($i = 0; $i < $string_length; $i++) {
// Check if keyword's first char == string's first char
if ($keyword_first_char == $string[$i]) {
return true;
}
}
}
// case 4
if ($keyword_length > 1) {
for ($i = 0; $i < $string_length; $i++) {
/*
the remaining part of the string is equal or greater than the keyword
*/
if (($string_length + 1 - $i) >= $keyword_length) {
// Check if keyword's first char == string's first char
if ($keyword_first_char == $string[$i]) {
$match = 1;
for ($j = 1; $j < $keyword_length; $j++) {
if (($i + $j < $string_length) && $keyword[$j] == $string[$i + $j]) {
$match++;
}
else {
return false;
}
}
if ($match == $keyword_length) {
return true;
}
// end if first match found
}
// end if remaining part
}
else {
return false;
}
// end for loop
}
// end case4
}
return false;
}
}
ทดสอบ:
var_dump(is_str_contain("test", "t")); //true
var_dump(is_str_contain("test", "")); //false
var_dump(is_str_contain("test", "test")); //true
var_dump(is_str_contain("test", "testa")); //flase
var_dump(is_str_contain("a----z", "a")); //true
var_dump(is_str_contain("a----z", "z")); //true
var_dump(is_str_contain("mystringss", "strings")); //true
คุณสามารถใช้strstr
ฟังก์ชั่น:
$haystack = "I know programming";
$needle = "know";
$flag = strstr($haystack, $needle);
if ($flag){
echo "true";
}
โดยไม่ต้องใช้ฟังก์ชั่น inbuilt:
$haystack = "hello world";
$needle = "llo";
$i = $j = 0;
while (isset($needle[$i])) {
while (isset($haystack[$j]) && ($needle[$i] != $haystack[$j])) {
$j++;
$i = 0;
}
if (!isset($haystack[$j])) {
break;
}
$i++;
$j++;
}
if (!isset($needle[$i])) {
echo "YES";
}
else{
echo "NO ";
}
ฉันมีปัญหากับเรื่องนี้และสุดท้ายฉันก็เลือกที่จะสร้างทางออกของตัวเอง โดยไม่ใช้เอ็นจิ้นนิพจน์ทั่วไป :
function contains($text, $word)
{
$found = false;
$spaceArray = explode(' ', $text);
$nonBreakingSpaceArray = explode(chr(160), $text);
if (in_array($word, $spaceArray) ||
in_array($word, $nonBreakingSpaceArray)
) {
$found = true;
}
return $found;
}
คุณอาจสังเกตเห็นว่าคำตอบก่อนหน้านี้ไม่ใช่คำตอบสำหรับคำที่ใช้เป็นคำนำหน้าสำหรับคำอื่น ในการใช้ตัวอย่างของคุณ:
$a = 'How are you?';
$b = "a skirt that flares from the waist";
$c = "are";
กับตัวอย่างข้างต้นทั้งสอง$a
และ$b
มี$c
แต่คุณอาจต้องการการทำงานของคุณจะบอกคุณว่ามีเพียงมี$a
$c
$found = false
ที่จุดเริ่มต้น
ตัวเลือกอื่นในการค้นหาการเกิดขึ้นของคำจากสตริงโดยใช้strstr ()และstristr ()เป็นดังนี้:
<?php
$a = 'How are you?';
if (strstr($a,'are')) // Case sensitive
echo 'true';
if (stristr($a,'are')) // Case insensitive
echo 'true';
?>
i
ในstristr
ย่อมาจากความรู้สึก
มีคำตอบมากมายที่ใช้substr_count
ตรวจสอบว่าผลลัพธ์คือ>0
อะไร แต่เนื่องจากif
คำสั่งพิจารณาว่าศูนย์เหมือนกับเท็จคุณสามารถหลีกเลี่ยงการตรวจสอบและเขียนโดยตรง:
if (substr_count($a, 'are')) {
ในการตรวจสอบว่าไม่มีอยู่ให้เพิ่ม!
โอเปอเรเตอร์:
if (!substr_count($a, 'are')) {
สามารถทำได้สามวิธี:
$a = 'How are you?';
1- stristr ()
if (strlen(stristr($a,"are"))>0) {
echo "true"; // are Found
}
2- strpos ()
if (strpos($a, "are") !== false) {
echo "true"; // are Found
}
3- preg_match ()
if( preg_match("are",$a) === 1) {
echo "true"; // are Found
}
รุ่นสั้น
$result = false!==strpos($a, 'are');
เพื่อค้นหา 'คำ' แทนที่จะเกิดตัวอักษรขึ้นมาหลาย ๆ ชุดซึ่งในความเป็นจริงอาจเป็นส่วนหนึ่งของคำอื่น ๆ ต่อไปนี้จะเป็นทางออกที่ดี
$string = 'How are you?';
$array = explode(" ", $string);
if (in_array('are', $array) ) {
echo 'Found the word';
}
$string
เป็นAre are, are?
คุณควรใช้รูปแบบตัวพิมพ์เล็กและตัวพิมพ์เล็กดังนั้นหากค่าที่ป้อนอยู่ในsmall
หรือcaps
ไม่สำคัญ
<?php
$grass = "This is pratik joshi";
$needle = "pratik";
if (stripos($grass,$needle) !== false) {
/*If i EXCLUDE : !== false then if string is found at 0th location,
still it will say STRING NOT FOUND as it will return '0' and it
will goto else and will say NOT Found though it is found at 0th location.*/
echo 'Contains word';
}else{
echo "does NOT contain word";
}
?>
ที่นี่แถบค้นหาเข็มใน heystack โดยไม่คำนึงถึงกรณี (เล็ก / หมวก)
บางทีคุณอาจใช้สิ่งนี้:
<?php
findWord('Test all OK');
function findWord($text) {
if (strstr($text, 'ok')) {
echo 'Found a word';
}
else
{
echo 'Did not find a word';
}
}
?>
ห้ามใช้preg_match()
หากคุณต้องการตรวจสอบว่ามีสตริงหนึ่งอยู่ในสตริงอื่นหรือไม่ ใช้strpos()
หรือstrstr()
แทนเนื่องจากจะเร็วขึ้น ( http://in2.php.net/preg_match )
if (strpos($text, 'string_name') !== false){
echo 'get the string';
}
หากคุณต้องการตรวจสอบว่าสตริงมีคำเฉพาะหลายคำหรือไม่คุณสามารถทำได้:
$badWords = array("dette", "capitale", "rembourser", "ivoire", "mandat");
$string = "a string with the word ivoire";
$matchFound = preg_match_all("/\b(" . implode($badWords,"|") . ")\b/i", $string, $matches);
if ($matchFound) {
echo "a bad word has been found";
}
else {
echo "your string is okay";
}
สิ่งนี้มีประโยชน์ในการหลีกเลี่ยงสแปมเมื่อส่งอีเมลเช่น
ฟังก์ชั่นการทำงานที่ดี strpos แต่ถ้าคุณต้องการที่จะทำcase-insensitive
การตรวจสอบคำในวรรคแล้วคุณสามารถใช้ประโยชน์จากการทำงานของstripos
PHP
ตัวอย่างเช่น,
$result = stripos("I love PHP, I love PHP too!", "php");
if ($result === false) {
// Word does not exist
}
else {
// Word exists
}
ค้นหาตำแหน่งที่เกิดขึ้นครั้งแรกของสตริงย่อยที่ไม่ต้องคำนึงถึงตัวพิมพ์ใหญ่ - เล็กในสตริง
ถ้าคำนั้นไม่มีอยู่ในสตริงมันจะส่งคืนค่าเท็จอื่นมันจะส่งคืนตำแหน่งของคำนั้น
คุณต้องใช้ตัวดำเนินการเหมือนกัน / ไม่เหมือนกันเพราะ strpos สามารถส่งคืนค่า 0 เนื่องจากเป็นค่าดัชนี หากคุณชอบผู้ประกอบการที่ประกอบไปด้วยไตร่ตรองลองใช้สิ่งต่อไปนี้ (ดูย้อนหลังนิดหน่อยฉันจะยอมรับ):
echo FALSE === strpos($a,'are') ? 'false': 'true';
ตรวจสอบว่าสายอักขระมีคำเฉพาะหรือไม่
ซึ่งหมายความว่าจะต้องแก้ไขสตริงเป็นคำ (ดูหมายเหตุด้านล่าง)
วิธีหนึ่งในการทำเช่นนี้และเพื่อระบุตัวคั่นคือการใช้preg_split
( doc ):
<?php
function contains_word($str, $word) {
// split string into words
// separators are substrings of at least one non-word character
$arr = preg_split('/\W+/', $str, NULL, PREG_SPLIT_NO_EMPTY);
// now the words can be examined each
foreach ($arr as $value) {
if ($value === $word) {
return true;
}
}
return false;
}
function test($str, $word) {
if (contains_word($str, $word)) {
echo "string '" . $str . "' contains word '" . $word . "'\n";
} else {
echo "string '" . $str . "' does not contain word '" . $word . "'\n" ;
}
}
$a = 'How are you?';
test($a, 'are');
test($a, 'ar');
test($a, 'hare');
?>
การวิ่งให้
$ php -f test.php
string 'How are you?' contains word 'are'
string 'How are you?' does not contain word 'ar'
string 'How are you?' does not contain word 'hare'
หมายเหตุ: ที่นี่เราไม่ได้หมายถึงคำสำหรับทุกลำดับของสัญลักษณ์
คำจำกัดความที่ใช้งานจริงของคำนั้นอยู่ในความหมายของเอ็นจิ้นการแสดงออกปกติของ PCRE โดยที่คำนั้นเป็นสตริงย่อยที่ประกอบด้วยอักขระคำเท่านั้นโดยจะถูกคั่นด้วยอักขระที่ไม่ใช่คำ
อักขระ "คำ" คือตัวอักษรหรือตัวเลขหรือตัวอักษรขีดล่างซึ่งก็คือตัวอักษรใด ๆ ที่สามารถเป็นส่วนหนึ่งของคำว่า "Perl" คำจำกัดความของตัวอักษรและตัวเลขถูกควบคุมโดยตารางอักขระของ PCRE และอาจแตกต่างกันไปหากการจับคู่แบบระบุตำแหน่งกระทำการ (.. )
โซลูชันอื่นสำหรับสตริงเฉพาะ:
$subject = 'How are you?';
$pattern = '/are/';
preg_match($pattern, $subject, $match);
if ($match[0] == 'are') {
echo true;
}
คุณยังสามารถใช้strpos()
ฟังก์ชั่น