diff --git a/src/wp-includes/formatting.php b/src/wp-includes/formatting.php
index e690948ea2..38cd23c95e 100644
--- a/src/wp-includes/formatting.php
+++ b/src/wp-includes/formatting.php
@@ -2465,7 +2465,7 @@ function force_balance_tags( $text ) {
// WP bug fix for LOVE <3 (and other situations with '<' before a number)
$text = preg_replace( '#<([0-9]{1})#', '<$1', $text );
- while ( preg_match( '/<(\/?[\w:]*)\s*([^>]*)>/', $text, $regex ) ) {
+ while ( preg_match( '/<(\/?[\w:\-]*)\s*([^>]*)>/', $text, $regex ) ) {
$newtext .= $tagqueue;
$i = strpos( $text, $regex[0] );
diff --git a/tests/phpunit/tests/formatting/balanceTags.php b/tests/phpunit/tests/formatting/balanceTags.php
index 783c320780..f479d84d26 100644
--- a/tests/phpunit/tests/formatting/balanceTags.php
+++ b/tests/phpunit/tests/formatting/balanceTags.php
@@ -221,4 +221,42 @@ class Tests_Formatting_BalanceTags extends WP_UnitTestCase {
}
}
+ /**
+ * Get custom element data.
+ *
+ * @return array Data.
+ */
+ public function get_custom_element_data() {
+ return array(
+ array(
+ 'Test',
+ 'Test',
+ ),
+ array(
+ 'Test',
+ 'Test',
+ ),
+ array(
+ 'Test',
+ 'Test',
+ ),
+ array(
+ 'Test',
+ 'Test',
+ ),
+ );
+ }
+
+ /**
+ * Test custom elements.
+ *
+ * @ticket 47014
+ * @dataProvider get_custom_element_data()
+ *
+ * @param string $source Source.
+ * @param string $expected Expected.
+ */
+ public function test_custom_elements( $source, $expected ) {
+ $this->assertEquals( $expected, balanceTags( $source, true ) );
+ }
}