จะลบส่วนของสตริงได้อย่างไร? [ปิด]


152

ฉันจะลบบางส่วนของสตริงได้อย่างไร

สตริงตัวอย่าง: "REGISTER 11223344 here"

ฉันจะลบออก"11223344"จากสตริงตัวอย่างข้างต้นได้อย่างไร


คำถามของคุณไม่ชัดเจน / ไม่ชัดเจน คุณกำลังใช้คำศัพท์removeแต่ดูเหมือนว่าคุณจะหมายถึงextractเพื่อให้สามารถเก็บสตริงเป้าหมายในฐานข้อมูล
mickmackusa

@Makyen ฉันรู้สึกค่อนข้างมั่นใจว่าคุณได้ทำลายคำถามเพื่อให้คำตอบถูกต้อง ลองคิดดู: ทำไม OP ถึงต้องการบันทึกREGISTER hereในฐานข้อมูล
mickmackusa

2
@mickmackusa ลบสามารถตรงกันกับเอาออกไปเช่นเอา 11223344 ออกจากสตริงฉันล้มเหลวที่จะเห็นปัญหาที่นี่ ที่เลวร้ายที่สุดมันคลุมเครือแน่นอนไม่ใช่ "ทำลายทรัพย์สิน"
นิค

อ่านเวอร์ชันก่อนการทำลายทรัพย์สิน @Nick stackoverflow.com/posts/2192170/revisionsความจริงจะเปลี่ยนความคิดของคุณ ฉันยินดีที่จะเห็นคำถามนี้ปิดเป็นไม่ชัดเจน
mickmackusa

2
@mickmackusa ฉันทำ ... ฉันไม่เห็นจุดของคุณ หากคุณมีปัญหาใหญ่กับวิธีที่เขียนไว้ทำไมไม่แก้ไขด้วยตัวคุณเอง
นิค

คำตอบ:



119

คุณสามารถใช้str_replace ()ซึ่งถูกกำหนดเป็น:

str_replace($search, $replace, $subject)

ดังนั้นคุณสามารถเขียนรหัสเป็น:

$subject = 'REGISTER 11223344 here' ;
$search = '11223344' ;
$trimmed = str_replace($search, '', $subject) ;
echo $trimmed ;

หากคุณต้องการจับคู่ที่ดีขึ้นผ่านการแสดงออกปกติคุณสามารถใช้preg_replace ()


2
หากต้องการจับคู่ regex ก็มี preg_replace () us2.php.net/manual/en/function.preg-replace.php
Elijah Lynn

4
ไม่แน่ใจว่าทำไมคำตอบนี้ถูกโพสต์มันเป็นคำตอบที่ยาวกว่าของDominicและคำตอบที่ซ้ำกันสั้นกว่าของRoland ...
CPHPython

23

สมมติว่า 11223344 นั้นไม่คงที่

$string="REGISTER 11223344 here";
$s = explode(" ",$string);
unset($s[1]);
$s = implode(" ",$s);
print "$s\n";

10
str_replace(find, replace, string, count)
  • ค้นหาที่จำเป็น ระบุค่าที่จะค้นหา
  • แทนที่ จำเป็น ระบุค่าเพื่อแทนที่ค่าในการค้นหา
  • จำเป็นต้องใช้สตริง ระบุสตริงที่จะค้นหา
  • นับเป็น ทางเลือก ตัวแปรที่นับจำนวนการเปลี่ยน

ตามตัวอย่าง OP:

$Example_string = "REGISTER 11223344 here";
$Example_string_PART_REMOVED = str_replace('11223344', '', $Example_string);

// will leave you with "REGISTER  here"

// finally - clean up potential double spaces, beginning spaces or end spaces that may have resulted from removing the unwanted string
$Example_string_COMPLETED = trim(str_replace('  ', ' ', $Example_string_PART_REMOVED));
// trim() will remove any potential leading and trailing spaces - the additional 'str_replace()' will remove any potential double spaces

// will leave you with "REGISTER here"

1
คุณเสนอว่า OP ใช้รหัสเทียมนี้ได้อย่างไร
mickmackusa

6

เมื่อคุณต้องการจับคู่ตามกฎคุณต้องใช้ regex

$string = "REGISTER 11223344 here";
preg_match("/(\d+)/", $string, $match);
$number = $match[1];

ซึ่งจะตรงกับตัวเลขชุดแรกดังนั้นหากคุณต้องลองแบบเจาะจงมากขึ้น:

$string = "REGISTER 11223344 here";
preg_match("/REGISTER (\d+) here/", $string, $match);
$number = $match[1];

preg_replace () จะง่ายกว่านี้ใช่ไหม us2.php.net/manual/th/function.preg-replace.php
Elijah Lynn

1
@ElijahLynn แทนที่คุณต้องการที่จะลบสิ่งต่าง ๆ การเปลี่ยนแปลงในอนาคตหรือเสียงจะแตก การทำสิ่งนี้ผ่าน _replace แต่ _match จะทำงานต่อไปได้
TravisO

@ TravisO ดีใช่ แต่ไม่ใช่ ทั้งสองเกือบจะดำเนินงานฟังก์ชั่นเดียวกันที่ชาญฉลาดและมีโอกาสที่ส่งผลกระทบต่อการเปลี่ยนแปลงในอนาคตของพวกเขาเหมือนกัน มีความเป็นไปได้ที่การเปลี่ยนแปลงใน _match ในอนาคตเท่านั้นทำให้การใช้งานนี้ไม่ถูกต้องและ _replace ยังทำงานได้ดี นอกจากนี้การกำหนดเวอร์ชันมักเป็นสิ่งที่สังเกตไม่ได้ว่าจะหยุดการทำงานก่อนหน้านี้หากเป็นไปได้
กะรัต

คุณไม่ต้องการกลุ่มจับภาพที่นี่ ในความเป็นจริงการใช้กลุ่มการดักจับจะขยาย$matchอาร์เรย์ออกโดยไม่จำเป็น ลบวงเล็บแล้ว acces $match[0]ผ่าน
mickmackusa

5

substr () เป็นฟังก์ชัน php ในตัวซึ่งคืนค่าส่วนหนึ่งของสตริง substr ฟังก์ชั่น () จะใช้สตริงเป็นอินพุตในรูปแบบดัชนีที่คุณต้องการสตริงที่จะถูกตัดแต่ง และพารามิเตอร์ทางเลือกคือความยาวของสตริงย่อย คุณสามารถดูเอกสารที่เหมาะสมและรหัสตัวอย่างได้ที่http://php.net/manual/th/function.substr.php

หมายเหตุ: ดัชนีสำหรับสตริงเริ่มต้นด้วย 0


คุณเสนอว่า OP ควรใช้คำใบ้ทั่วไปเพื่อให้ได้ผลลัพธ์ที่ต้องการได้อย่างไร
mickmackusa

ฉันพบว่าคำตอบนี้จะคลุมเครือและมีราคาต่ำ
mickmackusa

1

แบบไดนามิกหากคุณต้องการลบ (a) ส่วน (s) จาก (a) ดัชนีคงที่ (es) ของสตริงใช้ฟังก์ชั่นนี้:

/**
 * Removes index/indexes from a string, using a delimiter.
 * 
 * @param string $string
 * @param int|int[] $index An index, or a list of indexes to be removed from string.
 * @param string $delimiter 
 * @return string
 * @todo Note: For PHP versions lower than 7.0, remove scalar type hints (i.e. the
 * types before each argument) and the return type.
 */
function removeFromString(string $string, $index, string $delimiter = " "): string
{
    $stringParts = explode($delimiter, $string);

    // Remove indexes from string parts
    if (is_array($index)) {
        foreach ($index as $i) {
            unset($stringParts[(int)($i)]);
        }
    } else {
        unset($stringParts[(int)($index)]);
    }

    // Join all parts together and return it
    return implode($delimiter, $stringParts);
}

เพื่อจุดประสงค์ของคุณ:

remove_from_str("REGISTER 11223344 here", 1); // Output: REGISTER here

หนึ่งในประเพณีคือการใช้งานคำสั่งที่เหมือนคำสั่งซึ่งคุณรู้จักโครงสร้างของมัน


1
Ghostdog แนะนำเทคนิคการระเบิดแบบระเบิดแล้ว แต่ฉันไม่สามารถจินตนาการถึงความบันเทิงเช่นเทคนิคลมกรดแบบยาวสำหรับการใช้งานพื้นฐาน
mickmackusa

0

ตัวอย่างต่อไปนี้จะพิมพ์ "ลงทะเบียนที่นี่"

$string = "REGISTER 11223344 here";

$result = preg_replace(
   array('/(\d+)/'),
   array(''),
   $string
);

print_r($result);

preg_replace () API ใช้งานเราตามที่ได้รับด้านล่าง

$result = preg_replace(
    array('/pattern1/', '/pattern2/'),
    array('replace1', 'replace2'),
    $input_string
);

ไม่มีเหตุผลใดที่จะส่งผ่านอาร์เรย์ไปยังpreg_replace()ในกรณีนี้ ไม่มีประโยชน์ใด ๆ ในการใช้กลุ่มการจับกุม
mickmackusa

ฉันเห็นด้วย. มีการเพิ่ม Array เพื่อความสะดวก มันสามารถถูกทอดทิ้ง มันจะไม่ทำอันตราย เพิ่มกลุ่มการดักจับสำหรับการยกเว้นหมายเลข สิ่งนี้ใช้งานได้ตามคำถามที่วางแผนไว้ และการแก้ไขเพิ่มเติมและการปรับจูนสามารถทำได้ขึ้นอยู่กับแต่ละบุคคล
arango_86

จุดของฉันคือมีการรวมที่ไม่จำเป็นในตัวอย่างของคุณที่ไม่มีเหตุผลที่จะรวม
mickmackusa

-1

ทำดังต่อไปนี้

$string = 'REGISTER 11223344 here';

$content = preg_replace('/REGISTER(.*)here/','',$string);

สิ่งนี้จะส่งคืน "ลงทะเบียนที่นี่"

หรือ

$string = 'REGISTER 11223344 here';

$content = preg_replace('/REGISTER (.*) here/','',$string);

สิ่งนี้จะส่งกลับ "ลงทะเบียนที่นี่"


4
มันจะไม่ส่งกลับ "REGISTER__ ที่นี่" โดยมีช่องว่างสองช่อง (คิดว่าขีดเส้นใต้เป็นช่องว่างความคิดเห็นจะไม่ยอมให้มีช่องว่างตามมาสองช่อง) ใช่ไหม Beacuse ของช่องว่างก่อนและหลัง "(. *)"
TechNyquist

6
คำตอบนี้ผิดอย่างน้อย 100% พิสูจน์: 3v4l.org/LDLEM ทำไมคำตอบนี้จึงมี 15 UVs
mickmackusa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.